diff --git a/arch/x86_64/kernel/include/arch-memory.h b/arch/x86_64/kernel/include/arch-memory.h index 385e31ad..b3b931cb 100644 --- a/arch/x86_64/kernel/include/arch-memory.h +++ b/arch/x86_64/kernel/include/arch-memory.h @@ -58,8 +58,14 @@ #define MAP_ST_START 0xffff800000000000UL #define MAP_VMAP_START 0xffff850000000000UL #define MAP_FIXED_START 0xffff860000000000UL -#define MAP_KERNEL_START 0xffff870000000000UL #define LINUX_PAGE_OFFSET 0xffff880000000000UL +/* + * MAP_KERNEL_START is 8MB below MODULES_END in Linux. + * Placing the LWK image in the virtual address space at the end of + * the Linux modules section enables us to map the LWK TEXT in Linux + * as well, so that Linux can also call into LWK text. + */ +#define MAP_KERNEL_START 0xFFFFFFFFFE800000UL #define STACK_TOP(region) ((region)->user_end) #define MAP_VMAP_SIZE 0x0000000100000000UL diff --git a/arch/x86_64/kernel/memory.c b/arch/x86_64/kernel/memory.c index a0988487..16c90e3b 100644 --- a/arch/x86_64/kernel/memory.c +++ b/arch/x86_64/kernel/memory.c @@ -2689,14 +2689,14 @@ unsigned long virt_to_phys(void *v) { unsigned long va = (unsigned long)v; - if (va >= LINUX_PAGE_OFFSET) { - return va - LINUX_PAGE_OFFSET; - } - else if (va >= MAP_KERNEL_START) { + if (va >= MAP_KERNEL_START) { dkprintf("%s: MAP_KERNEL_START <= 0x%lx <= LINUX_PAGE_OFFSET\n", __FUNCTION__, va); return va - MAP_KERNEL_START + x86_kernel_phys_base; } + else if (va >= LINUX_PAGE_OFFSET) { + return va - LINUX_PAGE_OFFSET; + } else if (va >= MAP_FIXED_START) { return va - MAP_FIXED_START; } diff --git a/kernel/config/smp-x86.lds b/kernel/config/smp-x86.lds index ba11abfc..e03c5da4 100644 --- a/kernel/config/smp-x86.lds +++ b/kernel/config/smp-x86.lds @@ -5,7 +5,7 @@ PHDRS } SECTIONS { - . = 0xffff870000001000; + . = 0xFFFFFFFFFE801000; _head = .; .text : {