forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/arch/xtensa/mm/highmem.c
....@@ -37,15 +37,10 @@
3737 color;
3838 }
3939
40
-void *kmap_atomic(struct page *page)
40
+void *kmap_atomic_high_prot(struct page *page, pgprot_t prot)
4141 {
4242 enum fixed_addresses idx;
4343 unsigned long vaddr;
44
-
45
- preempt_disable();
46
- pagefault_disable();
47
- if (!PageHighMem(page))
48
- return page_address(page);
4944
5045 idx = kmap_idx(kmap_atomic_idx_push(),
5146 DCACHE_ALIAS(page_to_phys(page)));
....@@ -53,13 +48,13 @@
5348 #ifdef CONFIG_DEBUG_HIGHMEM
5449 BUG_ON(!pte_none(*(kmap_pte + idx)));
5550 #endif
56
- set_pte(kmap_pte + idx, mk_pte(page, PAGE_KERNEL_EXEC));
51
+ set_pte(kmap_pte + idx, mk_pte(page, prot));
5752
5853 return (void *)vaddr;
5954 }
60
-EXPORT_SYMBOL(kmap_atomic);
55
+EXPORT_SYMBOL(kmap_atomic_high_prot);
6156
62
-void __kunmap_atomic(void *kvaddr)
57
+void kunmap_atomic_high(void *kvaddr)
6358 {
6459 if (kvaddr >= (void *)FIXADDR_START &&
6560 kvaddr < (void *)FIXADDR_TOP) {
....@@ -78,18 +73,19 @@
7873
7974 kmap_atomic_idx_pop();
8075 }
81
-
82
- pagefault_enable();
83
- preempt_enable();
8476 }
85
-EXPORT_SYMBOL(__kunmap_atomic);
77
+EXPORT_SYMBOL(kunmap_atomic_high);
8678
8779 void __init kmap_init(void)
8880 {
8981 unsigned long kmap_vstart;
9082
83
+ /* Check if this memory layout is broken because PKMAP overlaps
84
+ * page table.
85
+ */
86
+ BUILD_BUG_ON(PKMAP_BASE < TLBTEMP_BASE_1 + TLBTEMP_SIZE);
9187 /* cache the first kmap pte */
9288 kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
93
- kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
89
+ kmap_pte = virt_to_kpte(kmap_vstart);
9490 kmap_waitqueues_init();
9591 }