|
@@ -105,6 +105,11 @@ EXPORT_SYMBOL(VMALLOC_END);
|
|
struct page *vmemmap;
|
|
struct page *vmemmap;
|
|
EXPORT_SYMBOL(vmemmap);
|
|
EXPORT_SYMBOL(vmemmap);
|
|
|
|
|
|
|
|
+#ifdef CONFIG_64BIT
|
|
|
|
+unsigned long MODULES_VADDR;
|
|
|
|
+unsigned long MODULES_END;
|
|
|
|
+#endif
|
|
|
|
+
|
|
/* An array with a pointer to the lowcore of every CPU. */
|
|
/* An array with a pointer to the lowcore of every CPU. */
|
|
struct _lowcore *lowcore_ptr[NR_CPUS];
|
|
struct _lowcore *lowcore_ptr[NR_CPUS];
|
|
EXPORT_SYMBOL(lowcore_ptr);
|
|
EXPORT_SYMBOL(lowcore_ptr);
|
|
@@ -544,19 +549,23 @@ static void __init setup_memory_end(void)
|
|
|
|
|
|
/* Choose kernel address space layout: 2, 3, or 4 levels. */
|
|
/* Choose kernel address space layout: 2, 3, or 4 levels. */
|
|
#ifdef CONFIG_64BIT
|
|
#ifdef CONFIG_64BIT
|
|
- vmalloc_size = VMALLOC_END ?: 128UL << 30;
|
|
|
|
|
|
+ vmalloc_size = VMALLOC_END ?: (128UL << 30) - MODULES_LEN;
|
|
tmp = (memory_end ?: real_memory_size) / PAGE_SIZE;
|
|
tmp = (memory_end ?: real_memory_size) / PAGE_SIZE;
|
|
tmp = tmp * (sizeof(struct page) + PAGE_SIZE) + vmalloc_size;
|
|
tmp = tmp * (sizeof(struct page) + PAGE_SIZE) + vmalloc_size;
|
|
if (tmp <= (1UL << 42))
|
|
if (tmp <= (1UL << 42))
|
|
vmax = 1UL << 42; /* 3-level kernel page table */
|
|
vmax = 1UL << 42; /* 3-level kernel page table */
|
|
else
|
|
else
|
|
vmax = 1UL << 53; /* 4-level kernel page table */
|
|
vmax = 1UL << 53; /* 4-level kernel page table */
|
|
|
|
+ /* module area is at the end of the kernel address space. */
|
|
|
|
+ MODULES_END = vmax;
|
|
|
|
+ MODULES_VADDR = MODULES_END - MODULES_LEN;
|
|
|
|
+ VMALLOC_END = MODULES_VADDR;
|
|
#else
|
|
#else
|
|
vmalloc_size = VMALLOC_END ?: 96UL << 20;
|
|
vmalloc_size = VMALLOC_END ?: 96UL << 20;
|
|
vmax = 1UL << 31; /* 2-level kernel page table */
|
|
vmax = 1UL << 31; /* 2-level kernel page table */
|
|
-#endif
|
|
|
|
/* vmalloc area is at the end of the kernel address space. */
|
|
/* vmalloc area is at the end of the kernel address space. */
|
|
VMALLOC_END = vmax;
|
|
VMALLOC_END = vmax;
|
|
|
|
+#endif
|
|
VMALLOC_START = vmax - vmalloc_size;
|
|
VMALLOC_START = vmax - vmalloc_size;
|
|
|
|
|
|
/* Split remaining virtual space between 1:1 mapping & vmemmap array */
|
|
/* Split remaining virtual space between 1:1 mapping & vmemmap array */
|