2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* fixmap.h: compile-time virtual memory allocation
|
|
|
|
*
|
|
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
|
|
* for more details.
|
|
|
|
*
|
|
|
|
* Copyright (C) 1998 Ingo Molnar
|
|
|
|
*
|
|
|
|
* Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _ASM_FIXMAP_H
|
|
|
|
#define _ASM_FIXMAP_H
|
|
|
|
|
|
|
|
|
|
|
|
/* used by vmalloc.c, vsyscall.lds.S.
|
|
|
|
*
|
|
|
|
* Leave one empty page between vmalloc'ed areas and
|
|
|
|
* the start of the fixmap.
|
|
|
|
*/
|
2006-09-26 14:32:25 +08:00
|
|
|
extern unsigned long __FIXADDR_TOP;
|
2007-05-03 01:27:12 +08:00
|
|
|
#define FIXADDR_USER_START __fix_to_virt(FIX_VDSO)
|
|
|
|
#define FIXADDR_USER_END __fix_to_virt(FIX_VDSO - 1)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <asm/acpi.h>
|
|
|
|
#include <asm/apicdef.h>
|
|
|
|
#include <asm/page.h>
|
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
|
|
#include <linux/threads.h>
|
|
|
|
#include <asm/kmap_types.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Here we define all the compile-time 'special' virtual
|
|
|
|
* addresses. The point is to have a constant address at
|
|
|
|
* compile time, but to set the physical address only
|
|
|
|
* in the boot process. We allocate these special addresses
|
|
|
|
* from the end of virtual memory (0xfffff000) backwards.
|
|
|
|
* Also this lets us do fail-safe vmalloc(), we
|
|
|
|
* can guarantee that these special addresses and
|
|
|
|
* vmalloc()-ed addresses never overlap.
|
|
|
|
*
|
|
|
|
* these 'compile-time allocated' memory buffers are
|
|
|
|
* fixed-size 4k pages. (or larger if used with an increment
|
|
|
|
* highger than 1) use fixmap_set(idx,phys) to associate
|
|
|
|
* physical memory with fixmap indices.
|
|
|
|
*
|
|
|
|
* TLB entries of such buffers will not be flushed across
|
|
|
|
* task switches.
|
|
|
|
*/
|
|
|
|
enum fixed_addresses {
|
|
|
|
FIX_HOLE,
|
[PATCH] vdso: randomize the i386 vDSO by moving it into a vma
Move the i386 VDSO down into a vma and thus randomize it.
Besides the security implications, this feature also helps debuggers, which
can COW a vma-backed VDSO just like a normal DSO and can thus do
single-stepping and other debugging features.
It's good for hypervisors (Xen, VMWare) too, which typically live in the same
high-mapped address space as the VDSO, hence whenever the VDSO is used, they
get lots of guest pagefaults and have to fix such guest accesses up - which
slows things down instead of speeding things up (the primary purpose of the
VDSO).
There's a new CONFIG_COMPAT_VDSO (default=y) option, which provides support
for older glibcs that still rely on a prelinked high-mapped VDSO. Newer
distributions (using glibc 2.3.3 or later) can turn this option off. Turning
it off is also recommended for security reasons: attackers cannot use the
predictable high-mapped VDSO page as syscall trampoline anymore.
There is a new vdso=[0|1] boot option as well, and a runtime
/proc/sys/vm/vdso_enabled sysctl switch, that allows the VDSO to be turned
on/off.
(This version of the VDSO-randomization patch also has working ELF
coredumping, the previous patch crashed in the coredumping code.)
This code is a combined work of the exec-shield VDSO randomization
code and Gerd Hoffmann's hypervisor-centric VDSO patch. Rusty Russell
started this patch and i completed it.
[akpm@osdl.org: cleanups]
[akpm@osdl.org: compile fix]
[akpm@osdl.org: compile fix 2]
[akpm@osdl.org: compile fix 3]
[akpm@osdl.org: revernt MAXMEM change]
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Arjan van de Ven <arjan@infradead.org>
Cc: Gerd Hoffmann <kraxel@suse.de>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Zachary Amsden <zach@vmware.com>
Cc: Andi Kleen <ak@muc.de>
Cc: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-06-27 17:53:50 +08:00
|
|
|
FIX_VDSO,
|
serial: convert early_uart to earlycon for 8250
Beacuse SERIAL_PORT_DFNS is removed from include/asm-i386/serial.h and
include/asm-x86_64/serial.h. the serial8250_ports need to be probed late in
serial initializing stage. the console_init=>serial8250_console_init=>
register_console=>serial8250_console_setup will return -ENDEV, and console
ttyS0 can not be enabled at that time. need to wait till uart_add_one_port in
drivers/serial/serial_core.c to call register_console to get console ttyS0.
that is too late.
Make early_uart to use early_param, so uart console can be used earlier. Make
it to be bootconsole with CON_BOOT flag, so can use console handover feature.
and it will switch to corresponding normal serial console automatically.
new command line will be:
console=uart8250,io,0x3f8,9600n8
console=uart8250,mmio,0xff5e0000,115200n8
or
earlycon=uart8250,io,0x3f8,9600n8
earlycon=uart8250,mmio,0xff5e0000,115200n8
it will print in very early stage:
Early serial console at I/O port 0x3f8 (options '9600n8')
console [uart0] enabled
later for console it will print:
console handover: boot [uart0] -> real [ttyS0]
Signed-off-by: <yinghai.lu@sun.com>
Cc: Andi Kleen <ak@suse.de>
Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Gerd Hoffmann <kraxel@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-16 14:37:59 +08:00
|
|
|
FIX_DBGP_BASE,
|
|
|
|
FIX_EARLYCON_MEM_BASE,
|
2005-04-17 06:20:36 +08:00
|
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
|
|
|
FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_X86_IO_APIC
|
|
|
|
FIX_IO_APIC_BASE_0,
|
|
|
|
FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_X86_VISWS_APIC
|
|
|
|
FIX_CO_CPU, /* Cobalt timer */
|
2008-01-30 20:33:45 +08:00
|
|
|
FIX_CO_APIC, /* Cobalt APIC Redirection Table */
|
2005-04-17 06:20:36 +08:00
|
|
|
FIX_LI_PCIA, /* Lithium PCI Bridge A */
|
|
|
|
FIX_LI_PCIB, /* Lithium PCI Bridge B */
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_X86_F00F_BUG
|
|
|
|
FIX_F00F_IDT, /* Virtual mapping for IDT */
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_X86_CYCLONE_TIMER
|
|
|
|
FIX_CYCLONE_TIMER, /*cyclone timer register*/
|
2008-01-30 20:33:45 +08:00
|
|
|
#endif
|
2005-04-17 06:20:36 +08:00
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
|
|
FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
|
|
|
|
FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
|
|
|
|
#endif
|
2005-08-25 00:07:20 +08:00
|
|
|
#ifdef CONFIG_ACPI
|
2005-04-17 06:20:36 +08:00
|
|
|
FIX_ACPI_BEGIN,
|
|
|
|
FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_PCI_MMCONFIG
|
|
|
|
FIX_PCIE_MCFG,
|
2007-05-03 01:27:13 +08:00
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_PARAVIRT
|
|
|
|
FIX_PARAVIRT_BOOTMAP,
|
2005-04-17 06:20:36 +08:00
|
|
|
#endif
|
|
|
|
__end_of_permanent_fixed_addresses,
|
2008-01-30 20:33:48 +08:00
|
|
|
/*
|
|
|
|
* 256 temporary boot-time mappings, used by early_ioremap(),
|
|
|
|
* before ioremap() is functional.
|
|
|
|
*
|
|
|
|
* We round it up to the next 512 pages boundary so that we
|
|
|
|
* can have a single pgd entry and a single pte table:
|
|
|
|
*/
|
2008-01-30 20:33:45 +08:00
|
|
|
#define NR_FIX_BTMAPS 64
|
2008-01-30 20:33:45 +08:00
|
|
|
#define FIX_BTMAPS_NESTING 4
|
2008-01-30 20:33:48 +08:00
|
|
|
FIX_BTMAP_END =
|
|
|
|
__end_of_permanent_fixed_addresses + 512 -
|
|
|
|
(__end_of_permanent_fixed_addresses & 511),
|
2008-01-30 20:33:45 +08:00
|
|
|
FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_NESTING - 1,
|
2005-04-17 06:20:36 +08:00
|
|
|
FIX_WP_TEST,
|
x86: early boot debugging via FireWire (ohci1394_dma=early)
This patch adds a new configuration option, which adds support for a new
early_param which gets checked in arch/x86/kernel/setup_{32,64}.c:setup_arch()
to decide wether OHCI-1394 FireWire controllers should be initialized and
enabled for physical DMA access to allow remote debugging of early problems
like issues ACPI or other subsystems which are executed very early.
If the config option is not enabled, no code is changed, and if the boot
paramenter is not given, no new code is executed, and independent of that,
all new code is freed after boot, so the config option can be even enabled
in standard, non-debug kernels.
With specialized tools, it is then possible to get debugging information
from machines which have no serial ports (notebooks) such as the printk
buffer contents, or any data which can be referenced from global pointers,
if it is stored below the 4GB limit and even memory dumps of of the physical
RAM region below the 4GB limit can be taken without any cooperation from the
CPU of the host, so the machine can be crashed early, it does not matter.
In the extreme, even kernel debuggers can be accessed in this way. I wrote
a small kgdb module and an accompanying gdb stub for FireWire which allows
to gdb to talk to kgdb using remote remory reads and writes over FireWire.
An version of the gdb stub fore FireWire is able to read all global data
from a system which is running a a normal kernel without any kernel debugger,
without any interruption or support of the system's CPU. That way, e.g. the
task struct and so on can be read and even manipulated when the physical DMA
access is granted.
A HOWTO is included in this patch, in Documentation/debugging-via-ohci1394.txt
and I've put a copy online at
ftp://ftp.suse.de/private/bk/firewire/docs/debugging-via-ohci1394.txt
It also has links to all the tools which are available to make use of it
another copy of it is online at:
ftp://ftp.suse.de/private/bk/firewire/kernel/ohci1394_dma_early-v2.diff
Signed-Off-By: Bernhard Kaindl <bk@suse.de>
Tested-By: Thomas Renninger <trenn@suse.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2008-01-30 20:34:11 +08:00
|
|
|
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
|
|
|
|
FIX_OHCI1394_BASE,
|
|
|
|
#endif
|
2005-04-17 06:20:36 +08:00
|
|
|
__end_of_fixed_addresses
|
|
|
|
};
|
|
|
|
|
|
|
|
extern void __set_fixmap (enum fixed_addresses idx,
|
|
|
|
unsigned long phys, pgprot_t flags);
|
2006-09-26 14:32:25 +08:00
|
|
|
extern void reserve_top_address(unsigned long reserve);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
#define set_fixmap(idx, phys) \
|
|
|
|
__set_fixmap(idx, phys, PAGE_KERNEL)
|
|
|
|
/*
|
|
|
|
* Some hardware wants to get fixmapped without caching.
|
|
|
|
*/
|
|
|
|
#define set_fixmap_nocache(idx, phys) \
|
|
|
|
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
|
|
|
|
|
|
|
|
#define clear_fixmap(idx) \
|
|
|
|
__set_fixmap(idx, 0, __pgprot(0))
|
|
|
|
|
|
|
|
#define FIXADDR_TOP ((unsigned long)__FIXADDR_TOP)
|
|
|
|
|
|
|
|
#define __FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
|
|
|
|
#define __FIXADDR_BOOT_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
|
|
|
|
#define FIXADDR_START (FIXADDR_TOP - __FIXADDR_SIZE)
|
|
|
|
#define FIXADDR_BOOT_START (FIXADDR_TOP - __FIXADDR_BOOT_SIZE)
|
|
|
|
|
|
|
|
#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))
|
|
|
|
#define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
|
|
|
|
|
|
|
|
extern void __this_fixmap_does_not_exist(void);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 'index to address' translation. If anyone tries to use the idx
|
|
|
|
* directly without tranlation, we catch the bug with a NULL-deference
|
|
|
|
* kernel oops. Illegal ranges of incoming indices are caught too.
|
|
|
|
*/
|
|
|
|
static __always_inline unsigned long fix_to_virt(const unsigned int idx)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* this branch gets completely eliminated after inlining,
|
|
|
|
* except when someone tries to use fixaddr indices in an
|
|
|
|
* illegal way. (such as mixing up address types or using
|
|
|
|
* out-of-range indices).
|
|
|
|
*
|
|
|
|
* If it doesn't get removed, the linker will complain
|
|
|
|
* loudly with a reasonably clear error message..
|
|
|
|
*/
|
|
|
|
if (idx >= __end_of_fixed_addresses)
|
|
|
|
__this_fixmap_does_not_exist();
|
|
|
|
|
|
|
|
return __fix_to_virt(idx);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline unsigned long virt_to_fix(const unsigned long vaddr)
|
|
|
|
{
|
|
|
|
BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
|
|
|
|
return __virt_to_fix(vaddr);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
|
#endif
|