|
@@ -110,41 +110,24 @@ ENTRY(__tlbtemp_mapping_start)
|
|
|
#if (DCACHE_WAY_SIZE > PAGE_SIZE)
|
|
|
|
|
|
/*
|
|
|
- * clear_user_page (void *addr, unsigned long vaddr, struct page *page)
|
|
|
- * a2 a3 a4
|
|
|
+ * clear_page_alias(void *addr, unsigned long paddr)
|
|
|
+ * a2 a3
|
|
|
*/
|
|
|
|
|
|
-ENTRY(clear_user_page)
|
|
|
+ENTRY(clear_page_alias)
|
|
|
|
|
|
entry a1, 32
|
|
|
|
|
|
- /* Mark page dirty and determine alias. */
|
|
|
+ /* Skip setting up a temporary DTLB if not aliased low page. */
|
|
|
|
|
|
- movi a7, (1 << PG_ARCH_1)
|
|
|
- l32i a5, a4, PAGE_FLAGS
|
|
|
- xor a6, a2, a3
|
|
|
- extui a3, a3, PAGE_SHIFT, DCACHE_ALIAS_ORDER
|
|
|
- extui a6, a6, PAGE_SHIFT, DCACHE_ALIAS_ORDER
|
|
|
- or a5, a5, a7
|
|
|
- slli a3, a3, PAGE_SHIFT
|
|
|
- s32i a5, a4, PAGE_FLAGS
|
|
|
+ movi a5, PAGE_OFFSET
|
|
|
+ movi a6, 0
|
|
|
+ beqz a3, 1f
|
|
|
|
|
|
- /* Skip setting up a temporary DTLB if not aliased. */
|
|
|
-
|
|
|
- beqz a6, 1f
|
|
|
-
|
|
|
- /* Invalidate kernel page. */
|
|
|
-
|
|
|
- mov a10, a2
|
|
|
- call8 __invalidate_dcache_page
|
|
|
-
|
|
|
- /* Setup a temporary DTLB with the color of the VPN */
|
|
|
-
|
|
|
- movi a4, ((PAGE_KERNEL | _PAGE_HW_WRITE) - PAGE_OFFSET) & 0xffffffff
|
|
|
- movi a5, TLBTEMP_BASE_1 # virt
|
|
|
- add a6, a2, a4 # ppn
|
|
|
- add a2, a5, a3 # add 'color'
|
|
|
+ /* Setup a temporary DTLB for the addr. */
|
|
|
|
|
|
+ addi a6, a3, (PAGE_KERNEL | _PAGE_HW_WRITE)
|
|
|
+ mov a4, a2
|
|
|
wdtlb a6, a2
|
|
|
dsync
|
|
|
|
|
@@ -165,62 +148,43 @@ ENTRY(clear_user_page)
|
|
|
|
|
|
/* We need to invalidate the temporary idtlb entry, if any. */
|
|
|
|
|
|
-1: addi a2, a2, -PAGE_SIZE
|
|
|
- idtlb a2
|
|
|
+1: idtlb a4
|
|
|
dsync
|
|
|
|
|
|
retw
|
|
|
|
|
|
-ENDPROC(clear_user_page)
|
|
|
+ENDPROC(clear_page_alias)
|
|
|
|
|
|
/*
|
|
|
- * copy_page_user (void *to, void *from, unsigned long vaddr, struct page *page)
|
|
|
- * a2 a3 a4 a5
|
|
|
+ * copy_page_alias(void *to, void *from,
|
|
|
+ * a2 a3
|
|
|
+ * unsigned long to_paddr, unsigned long from_paddr)
|
|
|
+ * a4 a5
|
|
|
*/
|
|
|
|
|
|
-ENTRY(copy_user_page)
|
|
|
+ENTRY(copy_page_alias)
|
|
|
|
|
|
entry a1, 32
|
|
|
|
|
|
- /* Mark page dirty and determine alias for destination. */
|
|
|
-
|
|
|
- movi a8, (1 << PG_ARCH_1)
|
|
|
- l32i a9, a5, PAGE_FLAGS
|
|
|
- xor a6, a2, a4
|
|
|
- xor a7, a3, a4
|
|
|
- extui a4, a4, PAGE_SHIFT, DCACHE_ALIAS_ORDER
|
|
|
- extui a6, a6, PAGE_SHIFT, DCACHE_ALIAS_ORDER
|
|
|
- extui a7, a7, PAGE_SHIFT, DCACHE_ALIAS_ORDER
|
|
|
- or a9, a9, a8
|
|
|
- slli a4, a4, PAGE_SHIFT
|
|
|
- s32i a9, a5, PAGE_FLAGS
|
|
|
- movi a5, ((PAGE_KERNEL | _PAGE_HW_WRITE) - PAGE_OFFSET) & 0xffffffff
|
|
|
-
|
|
|
- beqz a6, 1f
|
|
|
-
|
|
|
- /* Invalidate dcache */
|
|
|
-
|
|
|
- mov a10, a2
|
|
|
- call8 __invalidate_dcache_page
|
|
|
+ /* Skip setting up a temporary DTLB for destination if not aliased. */
|
|
|
|
|
|
- /* Setup a temporary DTLB with a matching color. */
|
|
|
+ movi a6, 0
|
|
|
+ movi a7, 0
|
|
|
+ beqz a4, 1f
|
|
|
|
|
|
- movi a8, TLBTEMP_BASE_1 # base
|
|
|
- add a6, a2, a5 # ppn
|
|
|
- add a2, a8, a4 # add 'color'
|
|
|
+ /* Setup a temporary DTLB for destination. */
|
|
|
|
|
|
+ addi a6, a4, (PAGE_KERNEL | _PAGE_HW_WRITE)
|
|
|
wdtlb a6, a2
|
|
|
dsync
|
|
|
|
|
|
- /* Skip setting up a temporary DTLB for destination if not aliased. */
|
|
|
+ /* Skip setting up a temporary DTLB for source if not aliased. */
|
|
|
|
|
|
-1: beqz a7, 1f
|
|
|
+1: beqz a5, 1f
|
|
|
|
|
|
- /* Setup a temporary DTLB with a matching color. */
|
|
|
+ /* Setup a temporary DTLB for source. */
|
|
|
|
|
|
- movi a8, TLBTEMP_BASE_2 # base
|
|
|
- add a7, a3, a5 # ppn
|
|
|
- add a3, a8, a4
|
|
|
+ addi a7, a5, PAGE_KERNEL
|
|
|
addi a8, a3, 1 # way1
|
|
|
|
|
|
wdtlb a7, a8
|
|
@@ -271,7 +235,7 @@ ENTRY(copy_user_page)
|
|
|
|
|
|
retw
|
|
|
|
|
|
-ENDPROC(copy_user_page)
|
|
|
+ENDPROC(copy_page_alias)
|
|
|
|
|
|
#endif
|
|
|
|
|
@@ -300,6 +264,30 @@ ENTRY(__flush_invalidate_dcache_page_alias)
|
|
|
retw
|
|
|
|
|
|
ENDPROC(__flush_invalidate_dcache_page_alias)
|
|
|
+
|
|
|
+/*
|
|
|
+ * void __invalidate_dcache_page_alias (addr, phys)
|
|
|
+ * a2 a3
|
|
|
+ */
|
|
|
+
|
|
|
+ENTRY(__invalidate_dcache_page_alias)
|
|
|
+
|
|
|
+ entry sp, 16
|
|
|
+
|
|
|
+ movi a7, 0 # required for exception handler
|
|
|
+ addi a6, a3, (PAGE_KERNEL | _PAGE_HW_WRITE)
|
|
|
+ mov a4, a2
|
|
|
+ wdtlb a6, a2
|
|
|
+ dsync
|
|
|
+
|
|
|
+ ___invalidate_dcache_page a2 a3
|
|
|
+
|
|
|
+ idtlb a4
|
|
|
+ dsync
|
|
|
+
|
|
|
+ retw
|
|
|
+
|
|
|
+ENDPROC(__invalidate_dcache_page_alias)
|
|
|
#endif
|
|
|
|
|
|
ENTRY(__tlbtemp_mapping_itlb)
|