30
30
31
31
#include "../kernel/head.h"
32
32
33
- unsigned long kernel_virt_addr = KERNEL_LINK_ADDR ;
34
- EXPORT_SYMBOL (kernel_virt_addr );
33
+ struct kernel_mapping kernel_map __ro_after_init ;
34
+ EXPORT_SYMBOL (kernel_map );
35
+ #ifdef CONFIG_XIP_KERNEL
36
+ #define kernel_map (*(struct kernel_mapping *)XIP_FIXUP(&kernel_map))
37
+ #endif
38
+
35
39
#ifdef CONFIG_XIP_KERNEL
36
- #define kernel_virt_addr (*((unsigned long *)XIP_FIXUP(&kernel_virt_addr)))
37
40
extern char _xiprom [], _exiprom [];
38
41
#endif
39
42
@@ -211,25 +214,6 @@ static struct pt_alloc_ops _pt_ops __initdata;
211
214
#define pt_ops _pt_ops
212
215
#endif
213
216
214
- /* Offset between linear mapping virtual address and kernel load address */
215
- unsigned long va_pa_offset __ro_after_init ;
216
- EXPORT_SYMBOL (va_pa_offset );
217
- #ifdef CONFIG_XIP_KERNEL
218
- #define va_pa_offset (*((unsigned long *)XIP_FIXUP(&va_pa_offset)))
219
- #endif
220
- /* Offset between kernel mapping virtual address and kernel load address */
221
- #ifdef CONFIG_64BIT
222
- unsigned long va_kernel_pa_offset __ro_after_init ;
223
- EXPORT_SYMBOL (va_kernel_pa_offset );
224
- #endif
225
- #ifdef CONFIG_XIP_KERNEL
226
- #define va_kernel_pa_offset (*((unsigned long *)XIP_FIXUP(&va_kernel_pa_offset)))
227
- #endif
228
- unsigned long va_kernel_xip_pa_offset __ro_after_init ;
229
- EXPORT_SYMBOL (va_kernel_xip_pa_offset );
230
- #ifdef CONFIG_XIP_KERNEL
231
- #define va_kernel_xip_pa_offset (*((unsigned long *)XIP_FIXUP(&va_kernel_xip_pa_offset)))
232
- #endif
233
217
unsigned long pfn_base __ro_after_init ;
234
218
EXPORT_SYMBOL (pfn_base );
235
219
@@ -345,7 +329,7 @@ static pmd_t *__init get_pmd_virt_late(phys_addr_t pa)
345
329
346
330
static phys_addr_t __init alloc_pmd_early (uintptr_t va )
347
331
{
348
- BUG_ON ((va - kernel_virt_addr ) >> PGDIR_SHIFT );
332
+ BUG_ON ((va - kernel_map . virt_addr ) >> PGDIR_SHIFT );
349
333
350
334
return (uintptr_t )early_pmd ;
351
335
}
@@ -510,36 +494,24 @@ static __init pgprot_t pgprot_from_va(uintptr_t va)
510
494
#error "setup_vm() is called from head.S before relocate so it should not use absolute addressing."
511
495
#endif
512
496
513
- static uintptr_t load_pa __initdata ;
514
- uintptr_t load_sz ;
515
- #ifdef CONFIG_XIP_KERNEL
516
- #define load_pa (*((uintptr_t *)XIP_FIXUP(&load_pa)))
517
- #define load_sz (*((uintptr_t *)XIP_FIXUP(&load_sz)))
518
- #endif
519
-
520
497
#ifdef CONFIG_XIP_KERNEL
521
- static uintptr_t xiprom __initdata ;
522
- static uintptr_t xiprom_sz __initdata ;
523
- #define xiprom_sz (*((uintptr_t *)XIP_FIXUP(&xiprom_sz)))
524
- #define xiprom (*((uintptr_t *)XIP_FIXUP(&xiprom)))
525
-
526
498
static void __init create_kernel_page_table (pgd_t * pgdir , uintptr_t map_size ,
527
499
__always_unused bool early )
528
500
{
529
501
uintptr_t va , end_va ;
530
502
531
503
/* Map the flash resident part */
532
- end_va = kernel_virt_addr + xiprom_sz ;
533
- for (va = kernel_virt_addr ; va < end_va ; va += map_size )
504
+ end_va = kernel_map . virt_addr + kernel_map . xiprom_sz ;
505
+ for (va = kernel_map . virt_addr ; va < end_va ; va += map_size )
534
506
create_pgd_mapping (pgdir , va ,
535
- xiprom + (va - kernel_virt_addr ),
507
+ kernel_map . xiprom + (va - kernel_map . virt_addr ),
536
508
map_size , PAGE_KERNEL_EXEC );
537
509
538
510
/* Map the data in RAM */
539
- end_va = kernel_virt_addr + XIP_OFFSET + load_sz ;
540
- for (va = kernel_virt_addr + XIP_OFFSET ; va < end_va ; va += map_size )
511
+ end_va = kernel_map . virt_addr + XIP_OFFSET + kernel_map . size ;
512
+ for (va = kernel_map . virt_addr + XIP_OFFSET ; va < end_va ; va += map_size )
541
513
create_pgd_mapping (pgdir , va ,
542
- load_pa + (va - (kernel_virt_addr + XIP_OFFSET )),
514
+ kernel_map . phys_addr + (va - (kernel_map . virt_addr + XIP_OFFSET )),
543
515
map_size , PAGE_KERNEL );
544
516
}
545
517
#else
@@ -548,10 +520,10 @@ static void __init create_kernel_page_table(pgd_t *pgdir, uintptr_t map_size,
548
520
{
549
521
uintptr_t va , end_va ;
550
522
551
- end_va = kernel_virt_addr + load_sz ;
552
- for (va = kernel_virt_addr ; va < end_va ; va += map_size )
523
+ end_va = kernel_map . virt_addr + kernel_map . size ;
524
+ for (va = kernel_map . virt_addr ; va < end_va ; va += map_size )
553
525
create_pgd_mapping (pgdir , va ,
554
- load_pa + (va - kernel_virt_addr ),
526
+ kernel_map . phys_addr + (va - kernel_map . virt_addr ),
555
527
map_size ,
556
528
early ?
557
529
PAGE_KERNEL_EXEC : pgprot_from_va (va ));
@@ -566,25 +538,27 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)
566
538
pmd_t fix_bmap_spmd , fix_bmap_epmd ;
567
539
#endif
568
540
541
+ kernel_map .virt_addr = KERNEL_LINK_ADDR ;
542
+
569
543
#ifdef CONFIG_XIP_KERNEL
570
- xiprom = (uintptr_t )CONFIG_XIP_PHYS_ADDR ;
571
- xiprom_sz = (uintptr_t )(& _exiprom ) - (uintptr_t )(& _xiprom );
544
+ kernel_map . xiprom = (uintptr_t )CONFIG_XIP_PHYS_ADDR ;
545
+ kernel_map . xiprom_sz = (uintptr_t )(& _exiprom ) - (uintptr_t )(& _xiprom );
572
546
573
- load_pa = (uintptr_t )CONFIG_PHYS_RAM_BASE ;
574
- load_sz = (uintptr_t )(& _end ) - (uintptr_t )(& _sdata );
547
+ kernel_map . phys_addr = (uintptr_t )CONFIG_PHYS_RAM_BASE ;
548
+ kernel_map . size = (uintptr_t )(& _end ) - (uintptr_t )(& _sdata );
575
549
576
- va_kernel_xip_pa_offset = kernel_virt_addr - xiprom ;
550
+ kernel_map . va_kernel_xip_pa_offset = kernel_map . virt_addr - kernel_map . xiprom ;
577
551
#else
578
- load_pa = (uintptr_t )(& _start );
579
- load_sz = (uintptr_t )(& _end ) - load_pa ;
552
+ kernel_map . phys_addr = (uintptr_t )(& _start );
553
+ kernel_map . size = (uintptr_t )(& _end ) - kernel_map . phys_addr ;
580
554
#endif
581
555
582
- va_pa_offset = PAGE_OFFSET - load_pa ;
556
+ kernel_map . va_pa_offset = PAGE_OFFSET - kernel_map . phys_addr ;
583
557
#ifdef CONFIG_64BIT
584
- va_kernel_pa_offset = kernel_virt_addr - load_pa ;
558
+ kernel_map . va_kernel_pa_offset = kernel_map . virt_addr - kernel_map . phys_addr ;
585
559
#endif
586
560
587
- pfn_base = PFN_DOWN (load_pa );
561
+ pfn_base = PFN_DOWN (kernel_map . phys_addr );
588
562
589
563
/*
590
564
* Enforce boot alignment requirements of RV32 and
@@ -594,7 +568,7 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)
594
568
595
569
/* Sanity check alignment and size */
596
570
BUG_ON ((PAGE_OFFSET % PGDIR_SIZE ) != 0 );
597
- BUG_ON ((load_pa % map_size ) != 0 );
571
+ BUG_ON ((kernel_map . phys_addr % map_size ) != 0 );
598
572
599
573
pt_ops .alloc_pte = alloc_pte_early ;
600
574
pt_ops .get_pte_virt = get_pte_virt_early ;
@@ -611,19 +585,19 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)
611
585
create_pmd_mapping (fixmap_pmd , FIXADDR_START ,
612
586
(uintptr_t )fixmap_pte , PMD_SIZE , PAGE_TABLE );
613
587
/* Setup trampoline PGD and PMD */
614
- create_pgd_mapping (trampoline_pg_dir , kernel_virt_addr ,
588
+ create_pgd_mapping (trampoline_pg_dir , kernel_map . virt_addr ,
615
589
(uintptr_t )trampoline_pmd , PGDIR_SIZE , PAGE_TABLE );
616
590
#ifdef CONFIG_XIP_KERNEL
617
- create_pmd_mapping (trampoline_pmd , kernel_virt_addr ,
618
- xiprom , PMD_SIZE , PAGE_KERNEL_EXEC );
591
+ create_pmd_mapping (trampoline_pmd , kernel_map . virt_addr ,
592
+ kernel_map . xiprom , PMD_SIZE , PAGE_KERNEL_EXEC );
619
593
#else
620
- create_pmd_mapping (trampoline_pmd , kernel_virt_addr ,
621
- load_pa , PMD_SIZE , PAGE_KERNEL_EXEC );
594
+ create_pmd_mapping (trampoline_pmd , kernel_map . virt_addr ,
595
+ kernel_map . phys_addr , PMD_SIZE , PAGE_KERNEL_EXEC );
622
596
#endif
623
597
#else
624
598
/* Setup trampoline PGD */
625
- create_pgd_mapping (trampoline_pg_dir , kernel_virt_addr ,
626
- load_pa , PGDIR_SIZE , PAGE_KERNEL_EXEC );
599
+ create_pgd_mapping (trampoline_pg_dir , kernel_map . virt_addr ,
600
+ kernel_map . phys_addr , PGDIR_SIZE , PAGE_KERNEL_EXEC );
627
601
#endif
628
602
629
603
/*
0 commit comments