x86: fix fragile computation of vsyscall address
Previously, the address of the vsyscall page (VSYSCALL_PHYS_ADDR,
VSYSCALL_VIRT_ADDR) was computed by arithmetic on the address of the
last section. This leads to bugs when new sections are inserted, such
as the one fixed by commit d312ceda56
.
Let's compute it from the current address instead.
Signed-off-by: Anders Kaseorg <andersk@ksplice.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
daf7b9c921
commit
d223246ef7
@ -135,24 +135,21 @@ SECTIONS
|
|||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
|
|
||||||
#define VSYSCALL_ADDR (-10*1024*1024)
|
#define VSYSCALL_ADDR (-10*1024*1024)
|
||||||
#define VSYSCALL_PHYS_ADDR ((LOADADDR(.data) + SIZEOF(.data) + \
|
|
||||||
PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
|
|
||||||
#define VSYSCALL_VIRT_ADDR ((ADDR(.data) + SIZEOF(.data) + \
|
|
||||||
PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
|
|
||||||
|
|
||||||
#define VLOAD_OFFSET (VSYSCALL_ADDR - VSYSCALL_PHYS_ADDR)
|
#define VLOAD_OFFSET (VSYSCALL_ADDR - __vsyscall_0 + LOAD_OFFSET)
|
||||||
#define VLOAD(x) (ADDR(x) - VLOAD_OFFSET)
|
#define VLOAD(x) (ADDR(x) - VLOAD_OFFSET)
|
||||||
|
|
||||||
#define VVIRT_OFFSET (VSYSCALL_ADDR - VSYSCALL_VIRT_ADDR)
|
#define VVIRT_OFFSET (VSYSCALL_ADDR - __vsyscall_0)
|
||||||
#define VVIRT(x) (ADDR(x) - VVIRT_OFFSET)
|
#define VVIRT(x) (ADDR(x) - VVIRT_OFFSET)
|
||||||
|
|
||||||
|
. = ALIGN(4096);
|
||||||
|
__vsyscall_0 = .;
|
||||||
|
|
||||||
. = VSYSCALL_ADDR;
|
. = VSYSCALL_ADDR;
|
||||||
.vsyscall_0 : AT(VSYSCALL_PHYS_ADDR) {
|
.vsyscall_0 : AT(VLOAD(.vsyscall_0)) {
|
||||||
*(.vsyscall_0)
|
*(.vsyscall_0)
|
||||||
} :user
|
} :user
|
||||||
|
|
||||||
__vsyscall_0 = VSYSCALL_VIRT_ADDR;
|
|
||||||
|
|
||||||
. = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
|
. = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
|
||||||
.vsyscall_fn : AT(VLOAD(.vsyscall_fn)) {
|
.vsyscall_fn : AT(VLOAD(.vsyscall_fn)) {
|
||||||
*(.vsyscall_fn)
|
*(.vsyscall_fn)
|
||||||
@ -192,11 +189,9 @@ SECTIONS
|
|||||||
*(.vsyscall_3)
|
*(.vsyscall_3)
|
||||||
}
|
}
|
||||||
|
|
||||||
. = VSYSCALL_VIRT_ADDR + PAGE_SIZE;
|
. = __vsyscall_0 + PAGE_SIZE;
|
||||||
|
|
||||||
#undef VSYSCALL_ADDR
|
#undef VSYSCALL_ADDR
|
||||||
#undef VSYSCALL_PHYS_ADDR
|
|
||||||
#undef VSYSCALL_VIRT_ADDR
|
|
||||||
#undef VLOAD_OFFSET
|
#undef VLOAD_OFFSET
|
||||||
#undef VLOAD
|
#undef VLOAD
|
||||||
#undef VVIRT_OFFSET
|
#undef VVIRT_OFFSET
|
||||||
|
Loading…
Reference in New Issue
Block a user