|
10 | 10 | #include <asm/regdef.h> |
11 | 11 | #include <asm/stackframe.h> |
12 | 12 |
|
| 13 | +#define INVTLB_ADDR_GFALSE_AND_ASID 5 |
| 14 | + |
13 | 15 | #define PTRS_PER_PGD_BITS (PAGE_SHIFT - 3) |
14 | 16 | #define PTRS_PER_PUD_BITS (PAGE_SHIFT - 3) |
15 | 17 | #define PTRS_PER_PMD_BITS (PAGE_SHIFT - 3) |
@@ -136,13 +138,10 @@ tlb_huge_update_load: |
136 | 138 | ori t0, ra, _PAGE_VALID |
137 | 139 | st.d t0, t1, 0 |
138 | 140 | #endif |
139 | | - tlbsrch |
140 | | - addu16i.d t1, zero, -(CSR_TLBIDX_EHINV >> 16) |
141 | | - addi.d ra, t1, 0 |
142 | | - csrxchg ra, t1, LOONGARCH_CSR_TLBIDX |
143 | | - tlbwr |
144 | | - |
145 | | - csrxchg zero, t1, LOONGARCH_CSR_TLBIDX |
| 141 | + csrrd ra, LOONGARCH_CSR_ASID |
| 142 | + csrrd t1, LOONGARCH_CSR_BADV |
| 143 | + andi ra, ra, CSR_ASID_ASID |
| 144 | + invtlb INVTLB_ADDR_GFALSE_AND_ASID, ra, t1 |
146 | 145 |
|
147 | 146 | /* |
148 | 147 | * A huge PTE describes an area the size of the |
@@ -287,13 +286,11 @@ tlb_huge_update_store: |
287 | 286 | ori t0, ra, (_PAGE_VALID | _PAGE_DIRTY | _PAGE_MODIFIED) |
288 | 287 | st.d t0, t1, 0 |
289 | 288 | #endif |
290 | | - tlbsrch |
291 | | - addu16i.d t1, zero, -(CSR_TLBIDX_EHINV >> 16) |
292 | | - addi.d ra, t1, 0 |
293 | | - csrxchg ra, t1, LOONGARCH_CSR_TLBIDX |
294 | | - tlbwr |
| 289 | + csrrd ra, LOONGARCH_CSR_ASID |
| 290 | + csrrd t1, LOONGARCH_CSR_BADV |
| 291 | + andi ra, ra, CSR_ASID_ASID |
| 292 | + invtlb INVTLB_ADDR_GFALSE_AND_ASID, ra, t1 |
295 | 293 |
|
296 | | - csrxchg zero, t1, LOONGARCH_CSR_TLBIDX |
297 | 294 | /* |
298 | 295 | * A huge PTE describes an area the size of the |
299 | 296 | * configured huge page size. This is twice the |
@@ -436,6 +433,11 @@ tlb_huge_update_modify: |
436 | 433 | ori t0, ra, (_PAGE_VALID | _PAGE_DIRTY | _PAGE_MODIFIED) |
437 | 434 | st.d t0, t1, 0 |
438 | 435 | #endif |
| 436 | + csrrd ra, LOONGARCH_CSR_ASID |
| 437 | + csrrd t1, LOONGARCH_CSR_BADV |
| 438 | + andi ra, ra, CSR_ASID_ASID |
| 439 | + invtlb INVTLB_ADDR_GFALSE_AND_ASID, ra, t1 |
| 440 | + |
439 | 441 | /* |
440 | 442 | * A huge PTE describes an area the size of the |
441 | 443 | * configured huge page size. This is twice the |
@@ -466,7 +468,7 @@ tlb_huge_update_modify: |
466 | 468 | addu16i.d t1, zero, (PS_HUGE_SIZE << (CSR_TLBIDX_PS_SHIFT - 16)) |
467 | 469 | csrxchg t1, t0, LOONGARCH_CSR_TLBIDX |
468 | 470 |
|
469 | | - tlbwr |
| 471 | + tlbfill |
470 | 472 |
|
471 | 473 | /* Reset default page size */ |
472 | 474 | addu16i.d t0, zero, (CSR_TLBIDX_PS >> 16) |
|
0 commit comments