vmem.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. // SPDX-License-Identifier: GPL-2.0
  2. #define boot_fmt(fmt) "vmem: " fmt
  3. #include <linux/cpufeature.h>
  4. #include <linux/sched/task.h>
  5. #include <linux/pgtable.h>
  6. #include <linux/kasan.h>
  7. #include <asm/page-states.h>
  8. #include <asm/pgalloc.h>
  9. #include <asm/facility.h>
  10. #include <asm/sections.h>
  11. #include <asm/ctlreg.h>
  12. #include <asm/physmem_info.h>
  13. #include <asm/maccess.h>
  14. #include <asm/machine.h>
  15. #include <asm/abs_lowcore.h>
  16. #include "decompressor.h"
  17. #include "boot.h"
  18. struct ctlreg __bootdata_preserved(s390_invalid_asce);
  19. #ifdef CONFIG_PROC_FS
  20. atomic_long_t __bootdata_preserved(direct_pages_count[PG_DIRECT_MAP_MAX]);
  21. #endif
  22. #define init_mm (*(struct mm_struct *)vmlinux.init_mm_off)
  23. #define swapper_pg_dir vmlinux.swapper_pg_dir_off
  24. #define invalid_pg_dir vmlinux.invalid_pg_dir_off
  25. enum populate_mode {
  26. POPULATE_NONE,
  27. POPULATE_DIRECT,
  28. POPULATE_LOWCORE,
  29. POPULATE_ABS_LOWCORE,
  30. POPULATE_IDENTITY,
  31. POPULATE_KERNEL,
  32. #ifdef CONFIG_KASAN
  33. /* KASAN modes should be last and grouped together, see is_kasan_populate_mode() */
  34. POPULATE_KASAN_MAP_SHADOW,
  35. POPULATE_KASAN_ZERO_SHADOW,
  36. POPULATE_KASAN_SHALLOW
  37. #endif
  38. };
  39. #define POPULATE_MODE_NAME(t) case POPULATE_ ## t: return #t
  40. static inline const char *get_populate_mode_name(enum populate_mode t)
  41. {
  42. switch (t) {
  43. POPULATE_MODE_NAME(NONE);
  44. POPULATE_MODE_NAME(DIRECT);
  45. POPULATE_MODE_NAME(LOWCORE);
  46. POPULATE_MODE_NAME(ABS_LOWCORE);
  47. POPULATE_MODE_NAME(IDENTITY);
  48. POPULATE_MODE_NAME(KERNEL);
  49. #ifdef CONFIG_KASAN
  50. POPULATE_MODE_NAME(KASAN_MAP_SHADOW);
  51. POPULATE_MODE_NAME(KASAN_ZERO_SHADOW);
  52. POPULATE_MODE_NAME(KASAN_SHALLOW);
  53. #endif
  54. default:
  55. return "UNKNOWN";
  56. }
  57. }
  58. static bool is_kasan_populate_mode(enum populate_mode mode)
  59. {
  60. #ifdef CONFIG_KASAN
  61. return mode >= POPULATE_KASAN_MAP_SHADOW;
  62. #else
  63. return false;
  64. #endif
  65. }
  66. static void pgtable_populate(unsigned long addr, unsigned long end, enum populate_mode mode);
  67. #ifdef CONFIG_KASAN
  68. #define kasan_early_shadow_page vmlinux.kasan_early_shadow_page_off
  69. #define kasan_early_shadow_pte ((pte_t *)vmlinux.kasan_early_shadow_pte_off)
  70. #define kasan_early_shadow_pmd ((pmd_t *)vmlinux.kasan_early_shadow_pmd_off)
  71. #define kasan_early_shadow_pud ((pud_t *)vmlinux.kasan_early_shadow_pud_off)
  72. #define kasan_early_shadow_p4d ((p4d_t *)vmlinux.kasan_early_shadow_p4d_off)
  73. #define __sha(x) ((unsigned long)kasan_mem_to_shadow((void *)x))
  74. static pte_t pte_z;
  75. static inline void kasan_populate(unsigned long start, unsigned long end, enum populate_mode mode)
  76. {
  77. unsigned long sha_start = PAGE_ALIGN_DOWN(__sha(start));
  78. unsigned long sha_end = PAGE_ALIGN(__sha(end));
  79. boot_debug("%-17s 0x%016lx-0x%016lx >> 0x%016lx-0x%016lx\n", get_populate_mode_name(mode),
  80. start, end, sha_start, sha_end);
  81. pgtable_populate(sha_start, sha_end, mode);
  82. }
  83. static void kasan_populate_shadow(unsigned long kernel_start, unsigned long kernel_end)
  84. {
  85. pmd_t pmd_z = __pmd(__pa(kasan_early_shadow_pte) | _SEGMENT_ENTRY);
  86. pud_t pud_z = __pud(__pa(kasan_early_shadow_pmd) | _REGION3_ENTRY);
  87. p4d_t p4d_z = __p4d(__pa(kasan_early_shadow_pud) | _REGION2_ENTRY);
  88. unsigned long memgap_start = 0;
  89. unsigned long start, end;
  90. int i;
  91. pte_z = __pte(__pa(kasan_early_shadow_page) | pgprot_val(PAGE_KERNEL_RO));
  92. crst_table_init((unsigned long *)kasan_early_shadow_p4d, p4d_val(p4d_z));
  93. crst_table_init((unsigned long *)kasan_early_shadow_pud, pud_val(pud_z));
  94. crst_table_init((unsigned long *)kasan_early_shadow_pmd, pmd_val(pmd_z));
  95. memset64((u64 *)kasan_early_shadow_pte, pte_val(pte_z), PTRS_PER_PTE);
  96. __arch_set_page_dat(kasan_early_shadow_p4d, 1UL << CRST_ALLOC_ORDER);
  97. __arch_set_page_dat(kasan_early_shadow_pud, 1UL << CRST_ALLOC_ORDER);
  98. __arch_set_page_dat(kasan_early_shadow_pmd, 1UL << CRST_ALLOC_ORDER);
  99. __arch_set_page_dat(kasan_early_shadow_pte, 1);
  100. for_each_physmem_usable_range(i, &start, &end) {
  101. kasan_populate((unsigned long)__identity_va(start),
  102. (unsigned long)__identity_va(end),
  103. POPULATE_KASAN_MAP_SHADOW);
  104. if (memgap_start && physmem_info.info_source == MEM_DETECT_DIAG260) {
  105. kasan_populate((unsigned long)__identity_va(memgap_start),
  106. (unsigned long)__identity_va(start),
  107. POPULATE_KASAN_ZERO_SHADOW);
  108. }
  109. memgap_start = end;
  110. }
  111. kasan_populate(kernel_start + TEXT_OFFSET, kernel_end, POPULATE_KASAN_MAP_SHADOW);
  112. kasan_populate(0, (unsigned long)__identity_va(0), POPULATE_KASAN_ZERO_SHADOW);
  113. kasan_populate(AMODE31_START, AMODE31_END, POPULATE_KASAN_ZERO_SHADOW);
  114. /* shallowly populate kasan shadow for vmalloc and modules */
  115. kasan_populate(VMALLOC_START, MODULES_END, POPULATE_KASAN_SHALLOW);
  116. /* populate kasan shadow for untracked memory */
  117. kasan_populate((unsigned long)__identity_va(ident_map_size), VMALLOC_START,
  118. POPULATE_KASAN_ZERO_SHADOW);
  119. kasan_populate(kernel_end, _REGION1_SIZE, POPULATE_KASAN_ZERO_SHADOW);
  120. }
  121. static bool kasan_pgd_populate_zero_shadow(pgd_t *pgd, unsigned long addr,
  122. unsigned long end, enum populate_mode mode)
  123. {
  124. if (mode == POPULATE_KASAN_ZERO_SHADOW &&
  125. IS_ALIGNED(addr, PGDIR_SIZE) && end - addr >= PGDIR_SIZE) {
  126. pgd_populate(&init_mm, pgd, kasan_early_shadow_p4d);
  127. return true;
  128. }
  129. return false;
  130. }
  131. static bool kasan_p4d_populate_zero_shadow(p4d_t *p4d, unsigned long addr,
  132. unsigned long end, enum populate_mode mode)
  133. {
  134. if (mode == POPULATE_KASAN_ZERO_SHADOW &&
  135. IS_ALIGNED(addr, P4D_SIZE) && end - addr >= P4D_SIZE) {
  136. p4d_populate(&init_mm, p4d, kasan_early_shadow_pud);
  137. return true;
  138. }
  139. return false;
  140. }
  141. static bool kasan_pud_populate_zero_shadow(pud_t *pud, unsigned long addr,
  142. unsigned long end, enum populate_mode mode)
  143. {
  144. if (mode == POPULATE_KASAN_ZERO_SHADOW &&
  145. IS_ALIGNED(addr, PUD_SIZE) && end - addr >= PUD_SIZE) {
  146. pud_populate(&init_mm, pud, kasan_early_shadow_pmd);
  147. return true;
  148. }
  149. return false;
  150. }
  151. static bool kasan_pmd_populate_zero_shadow(pmd_t *pmd, unsigned long addr,
  152. unsigned long end, enum populate_mode mode)
  153. {
  154. if (mode == POPULATE_KASAN_ZERO_SHADOW &&
  155. IS_ALIGNED(addr, PMD_SIZE) && end - addr >= PMD_SIZE) {
  156. pmd_populate(&init_mm, pmd, kasan_early_shadow_pte);
  157. return true;
  158. }
  159. return false;
  160. }
  161. static bool kasan_pte_populate_zero_shadow(pte_t *pte, enum populate_mode mode)
  162. {
  163. if (mode == POPULATE_KASAN_ZERO_SHADOW) {
  164. set_pte(pte, pte_z);
  165. return true;
  166. }
  167. return false;
  168. }
  169. #else
  170. static inline void kasan_populate_shadow(unsigned long kernel_start, unsigned long kernel_end)
  171. {
  172. }
  173. static inline bool kasan_pgd_populate_zero_shadow(pgd_t *pgd, unsigned long addr,
  174. unsigned long end, enum populate_mode mode)
  175. {
  176. return false;
  177. }
  178. static inline bool kasan_p4d_populate_zero_shadow(p4d_t *p4d, unsigned long addr,
  179. unsigned long end, enum populate_mode mode)
  180. {
  181. return false;
  182. }
  183. static inline bool kasan_pud_populate_zero_shadow(pud_t *pud, unsigned long addr,
  184. unsigned long end, enum populate_mode mode)
  185. {
  186. return false;
  187. }
  188. static inline bool kasan_pmd_populate_zero_shadow(pmd_t *pmd, unsigned long addr,
  189. unsigned long end, enum populate_mode mode)
  190. {
  191. return false;
  192. }
  193. static bool kasan_pte_populate_zero_shadow(pte_t *pte, enum populate_mode mode)
  194. {
  195. return false;
  196. }
  197. #endif
  198. /*
  199. * Mimic virt_to_kpte() in lack of init_mm symbol. Skip pmd NULL check though.
  200. */
  201. static inline pte_t *__virt_to_kpte(unsigned long va)
  202. {
  203. return pte_offset_kernel(pmd_offset(pud_offset(p4d_offset(pgd_offset_k(va), va), va), va), va);
  204. }
  205. static void *boot_crst_alloc(unsigned long val)
  206. {
  207. unsigned long size = PAGE_SIZE << CRST_ALLOC_ORDER;
  208. unsigned long *table;
  209. table = (unsigned long *)physmem_alloc_or_die(RR_VMEM, size, size);
  210. crst_table_init(table, val);
  211. __arch_set_page_dat(table, 1UL << CRST_ALLOC_ORDER);
  212. return table;
  213. }
  214. static pte_t *boot_pte_alloc(void)
  215. {
  216. pte_t *pte;
  217. pte = (void *)physmem_alloc_or_die(RR_VMEM, PAGE_SIZE, PAGE_SIZE);
  218. __arch_set_page_dat(pte, 1);
  219. memset64((u64 *)pte, _PAGE_INVALID, PTRS_PER_PTE);
  220. return pte;
  221. }
  222. static unsigned long resolve_pa_may_alloc(unsigned long addr, unsigned long size,
  223. enum populate_mode mode)
  224. {
  225. switch (mode) {
  226. case POPULATE_NONE:
  227. return INVALID_PHYS_ADDR;
  228. case POPULATE_DIRECT:
  229. return addr;
  230. case POPULATE_LOWCORE:
  231. return __lowcore_pa(addr);
  232. case POPULATE_ABS_LOWCORE:
  233. return __abs_lowcore_pa(addr);
  234. case POPULATE_KERNEL:
  235. return __kernel_pa(addr);
  236. case POPULATE_IDENTITY:
  237. return __identity_pa(addr);
  238. #ifdef CONFIG_KASAN
  239. case POPULATE_KASAN_MAP_SHADOW:
  240. /* Allow to fail large page allocations, this will fall back to 1mb/4k pages */
  241. addr = physmem_alloc(RR_VMEM, size, size, size == PAGE_SIZE);
  242. if (addr) {
  243. memset((void *)addr, 0, size);
  244. return addr;
  245. }
  246. return INVALID_PHYS_ADDR;
  247. #endif
  248. default:
  249. return INVALID_PHYS_ADDR;
  250. }
  251. }
  252. static bool large_page_mapping_allowed(enum populate_mode mode)
  253. {
  254. switch (mode) {
  255. case POPULATE_DIRECT:
  256. case POPULATE_IDENTITY:
  257. case POPULATE_KERNEL:
  258. #ifdef CONFIG_KASAN
  259. case POPULATE_KASAN_MAP_SHADOW:
  260. #endif
  261. return true;
  262. default:
  263. return false;
  264. }
  265. }
  266. static unsigned long try_get_large_pud_pa(pud_t *pu_dir, unsigned long addr, unsigned long end,
  267. enum populate_mode mode)
  268. {
  269. unsigned long pa, size = end - addr;
  270. if (!cpu_has_edat2() || !large_page_mapping_allowed(mode) ||
  271. !IS_ALIGNED(addr, PUD_SIZE) || (size < PUD_SIZE))
  272. return INVALID_PHYS_ADDR;
  273. pa = resolve_pa_may_alloc(addr, size, mode);
  274. if (!IS_ALIGNED(pa, PUD_SIZE))
  275. return INVALID_PHYS_ADDR;
  276. return pa;
  277. }
  278. static unsigned long try_get_large_pmd_pa(pmd_t *pm_dir, unsigned long addr, unsigned long end,
  279. enum populate_mode mode)
  280. {
  281. unsigned long pa, size = end - addr;
  282. if (!cpu_has_edat1() || !large_page_mapping_allowed(mode) ||
  283. !IS_ALIGNED(addr, PMD_SIZE) || (size < PMD_SIZE))
  284. return INVALID_PHYS_ADDR;
  285. pa = resolve_pa_may_alloc(addr, size, mode);
  286. if (!IS_ALIGNED(pa, PMD_SIZE))
  287. return INVALID_PHYS_ADDR;
  288. return pa;
  289. }
  290. static void pgtable_pte_populate(pmd_t *pmd, unsigned long addr, unsigned long end,
  291. enum populate_mode mode)
  292. {
  293. unsigned long pages = 0;
  294. pte_t *pte, entry;
  295. pte = pte_offset_kernel(pmd, addr);
  296. for (; addr < end; addr += PAGE_SIZE, pte++) {
  297. if (pte_none(*pte)) {
  298. if (kasan_pte_populate_zero_shadow(pte, mode))
  299. continue;
  300. entry = __pte(resolve_pa_may_alloc(addr, PAGE_SIZE, mode));
  301. entry = set_pte_bit(entry, PAGE_KERNEL);
  302. set_pte(pte, entry);
  303. pages++;
  304. }
  305. }
  306. if (mode == POPULATE_IDENTITY)
  307. update_page_count(PG_DIRECT_MAP_4K, pages);
  308. }
  309. static void pgtable_pmd_populate(pud_t *pud, unsigned long addr, unsigned long end,
  310. enum populate_mode mode)
  311. {
  312. unsigned long pa, next, pages = 0;
  313. pmd_t *pmd, entry;
  314. pte_t *pte;
  315. pmd = pmd_offset(pud, addr);
  316. for (; addr < end; addr = next, pmd++) {
  317. next = pmd_addr_end(addr, end);
  318. if (pmd_none(*pmd)) {
  319. if (kasan_pmd_populate_zero_shadow(pmd, addr, next, mode))
  320. continue;
  321. pa = try_get_large_pmd_pa(pmd, addr, next, mode);
  322. if (pa != INVALID_PHYS_ADDR) {
  323. entry = __pmd(pa);
  324. entry = set_pmd_bit(entry, SEGMENT_KERNEL);
  325. set_pmd(pmd, entry);
  326. pages++;
  327. continue;
  328. }
  329. pte = boot_pte_alloc();
  330. pmd_populate(&init_mm, pmd, pte);
  331. } else if (pmd_leaf(*pmd)) {
  332. continue;
  333. }
  334. pgtable_pte_populate(pmd, addr, next, mode);
  335. }
  336. if (mode == POPULATE_IDENTITY)
  337. update_page_count(PG_DIRECT_MAP_1M, pages);
  338. }
  339. static void pgtable_pud_populate(p4d_t *p4d, unsigned long addr, unsigned long end,
  340. enum populate_mode mode)
  341. {
  342. unsigned long pa, next, pages = 0;
  343. pud_t *pud, entry;
  344. pmd_t *pmd;
  345. pud = pud_offset(p4d, addr);
  346. for (; addr < end; addr = next, pud++) {
  347. next = pud_addr_end(addr, end);
  348. if (pud_none(*pud)) {
  349. if (kasan_pud_populate_zero_shadow(pud, addr, next, mode))
  350. continue;
  351. pa = try_get_large_pud_pa(pud, addr, next, mode);
  352. if (pa != INVALID_PHYS_ADDR) {
  353. entry = __pud(pa);
  354. entry = set_pud_bit(entry, REGION3_KERNEL);
  355. set_pud(pud, entry);
  356. pages++;
  357. continue;
  358. }
  359. pmd = boot_crst_alloc(_SEGMENT_ENTRY_EMPTY);
  360. pud_populate(&init_mm, pud, pmd);
  361. } else if (pud_leaf(*pud)) {
  362. continue;
  363. }
  364. pgtable_pmd_populate(pud, addr, next, mode);
  365. }
  366. if (mode == POPULATE_IDENTITY)
  367. update_page_count(PG_DIRECT_MAP_2G, pages);
  368. }
  369. static void pgtable_p4d_populate(pgd_t *pgd, unsigned long addr, unsigned long end,
  370. enum populate_mode mode)
  371. {
  372. unsigned long next;
  373. p4d_t *p4d;
  374. pud_t *pud;
  375. p4d = p4d_offset(pgd, addr);
  376. for (; addr < end; addr = next, p4d++) {
  377. next = p4d_addr_end(addr, end);
  378. if (p4d_none(*p4d)) {
  379. if (kasan_p4d_populate_zero_shadow(p4d, addr, next, mode))
  380. continue;
  381. pud = boot_crst_alloc(_REGION3_ENTRY_EMPTY);
  382. p4d_populate(&init_mm, p4d, pud);
  383. }
  384. pgtable_pud_populate(p4d, addr, next, mode);
  385. }
  386. }
  387. static void pgtable_populate(unsigned long addr, unsigned long end, enum populate_mode mode)
  388. {
  389. unsigned long next;
  390. pgd_t *pgd;
  391. p4d_t *p4d;
  392. if (!is_kasan_populate_mode(mode)) {
  393. boot_debug("%-17s 0x%016lx-0x%016lx -> 0x%016lx-0x%016lx\n",
  394. get_populate_mode_name(mode), addr, end,
  395. resolve_pa_may_alloc(addr, 0, mode),
  396. resolve_pa_may_alloc(end - 1, 0, mode) + 1);
  397. }
  398. pgd = pgd_offset(&init_mm, addr);
  399. for (; addr < end; addr = next, pgd++) {
  400. next = pgd_addr_end(addr, end);
  401. if (pgd_none(*pgd)) {
  402. if (kasan_pgd_populate_zero_shadow(pgd, addr, next, mode))
  403. continue;
  404. p4d = boot_crst_alloc(_REGION2_ENTRY_EMPTY);
  405. pgd_populate(&init_mm, pgd, p4d);
  406. }
  407. #ifdef CONFIG_KASAN
  408. if (mode == POPULATE_KASAN_SHALLOW)
  409. continue;
  410. #endif
  411. pgtable_p4d_populate(pgd, addr, next, mode);
  412. }
  413. }
  414. void setup_vmem(unsigned long kernel_start, unsigned long kernel_end, unsigned long asce_limit)
  415. {
  416. unsigned long lowcore_address = 0;
  417. unsigned long start, end;
  418. unsigned long asce_type;
  419. unsigned long asce_bits;
  420. pgd_t *init_mm_pgd;
  421. int i;
  422. /*
  423. * Mark whole memory as no-dat. This must be done before any
  424. * page tables are allocated, or kernel image builtin pages
  425. * are marked as dat tables.
  426. */
  427. for_each_physmem_online_range(i, &start, &end)
  428. __arch_set_page_nodat((void *)start, (end - start) >> PAGE_SHIFT);
  429. /*
  430. * init_mm->pgd contains virtual address of swapper_pg_dir.
  431. * It is unusable at this stage since DAT is yet off. Swap
  432. * it for physical address of swapper_pg_dir and restore
  433. * the virtual address after all page tables are created.
  434. */
  435. init_mm_pgd = init_mm.pgd;
  436. init_mm.pgd = (pgd_t *)swapper_pg_dir;
  437. if (asce_limit == _REGION1_SIZE) {
  438. asce_type = _REGION2_ENTRY_EMPTY;
  439. asce_bits = _ASCE_TYPE_REGION2 | _ASCE_TABLE_LENGTH;
  440. } else {
  441. asce_type = _REGION3_ENTRY_EMPTY;
  442. asce_bits = _ASCE_TYPE_REGION3 | _ASCE_TABLE_LENGTH;
  443. }
  444. s390_invalid_asce.val = invalid_pg_dir | _ASCE_TYPE_REGION3 | _ASCE_TABLE_LENGTH;
  445. crst_table_init((unsigned long *)swapper_pg_dir, asce_type);
  446. crst_table_init((unsigned long *)invalid_pg_dir, _REGION3_ENTRY_EMPTY);
  447. __arch_set_page_dat((void *)swapper_pg_dir, 1UL << CRST_ALLOC_ORDER);
  448. __arch_set_page_dat((void *)invalid_pg_dir, 1UL << CRST_ALLOC_ORDER);
  449. if (machine_has_relocated_lowcore())
  450. lowcore_address = LOWCORE_ALT_ADDRESS;
  451. /*
  452. * To allow prefixing the lowcore must be mapped with 4KB pages.
  453. * To prevent creation of a large page at address 0 first map
  454. * the lowcore and create the identity mapping only afterwards.
  455. */
  456. pgtable_populate(lowcore_address,
  457. lowcore_address + sizeof(struct lowcore),
  458. POPULATE_LOWCORE);
  459. for_each_physmem_usable_range(i, &start, &end) {
  460. /* Do not map lowcore with identity mapping */
  461. if (!start)
  462. start = sizeof(struct lowcore);
  463. pgtable_populate((unsigned long)__identity_va(start),
  464. (unsigned long)__identity_va(end),
  465. POPULATE_IDENTITY);
  466. }
  467. /*
  468. * [kernel_start..kernel_start + TEXT_OFFSET] region is never
  469. * accessed as per the linker script:
  470. *
  471. * . = TEXT_OFFSET;
  472. *
  473. * Therefore, skip mapping TEXT_OFFSET bytes to prevent access to
  474. * [__kaslr_offset_phys..__kaslr_offset_phys + TEXT_OFFSET] region.
  475. */
  476. pgtable_populate(kernel_start + TEXT_OFFSET, kernel_end, POPULATE_KERNEL);
  477. pgtable_populate(AMODE31_START, AMODE31_END, POPULATE_DIRECT);
  478. pgtable_populate(__abs_lowcore, __abs_lowcore + sizeof(struct lowcore),
  479. POPULATE_ABS_LOWCORE);
  480. pgtable_populate(__memcpy_real_area, __memcpy_real_area + PAGE_SIZE,
  481. POPULATE_NONE);
  482. memcpy_real_ptep = __identity_va(__virt_to_kpte(__memcpy_real_area));
  483. kasan_populate_shadow(kernel_start, kernel_end);
  484. get_lowcore()->kernel_asce.val = swapper_pg_dir | asce_bits;
  485. get_lowcore()->user_asce = s390_invalid_asce;
  486. local_ctl_load(1, &get_lowcore()->kernel_asce);
  487. local_ctl_load(7, &get_lowcore()->user_asce);
  488. local_ctl_load(13, &get_lowcore()->kernel_asce);
  489. init_mm.context.asce = get_lowcore()->kernel_asce.val;
  490. init_mm.pgd = init_mm_pgd;
  491. }