|
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