MIPS: Implement Read Inhibit/eXecute Inhibit
The SmartMIPS ASE specifies how Read Inhibit (RI) and eXecute Inhibit (XI) bits in the page tables work. The upper two bits of EntryLo{0,1} are RI and XI when the feature is enabled in the PageGrain register. SmartMIPS only covers 32-bit systems. Cavium Octeon+ extends this to 64-bit systems by continuing to place the RI and XI bits in the top of EntryLo even when EntryLo is 64-bits wide. Because we need to carry the RI and XI bits in the PTE, the layout of the PTE is changed. There is a two instruction overhead in the TLB refill hot path to get the EntryLo bits into the proper position. Also the TLB load exception has to probe the TLB to check if RI or XI caused the exception. Also of note is that the layout of the PTE bits is done at compile and runtime rather than statically. In the 32-bit case this allows for the same number of PFN bits as before the patch as the _PAGE_HUGE is not supported in 32-bit kernels (we have _PAGE_NO_EXEC and _PAGE_NO_READ instead of _PAGE_READ and _PAGE_HUGE). The patch is tested on Cavium Octeon+, but should also work on 32-bit systems with the Smart-MIPS ASE. Signed-off-by: David Daney <ddaney@caviumnetworks.com> To: linux-mips@linux-mips.org Patchwork: http://patchwork.linux-mips.org/patch/952/ Patchwork: http://patchwork.linux-mips.org/patch/956/ Patchwork: http://patchwork.linux-mips.org/patch/962/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:

committed by
Ralf Baechle

parent
32546f38fa
commit
6dd9344cfc
@@ -137,22 +137,43 @@ EXPORT_SYMBOL_GPL(_page_cachable_default);
|
||||
|
||||
static inline void setup_protection_map(void)
|
||||
{
|
||||
protection_map[0] = PAGE_NONE;
|
||||
protection_map[1] = PAGE_READONLY;
|
||||
protection_map[2] = PAGE_COPY;
|
||||
protection_map[3] = PAGE_COPY;
|
||||
protection_map[4] = PAGE_READONLY;
|
||||
protection_map[5] = PAGE_READONLY;
|
||||
protection_map[6] = PAGE_COPY;
|
||||
protection_map[7] = PAGE_COPY;
|
||||
protection_map[8] = PAGE_NONE;
|
||||
protection_map[9] = PAGE_READONLY;
|
||||
protection_map[10] = PAGE_SHARED;
|
||||
protection_map[11] = PAGE_SHARED;
|
||||
protection_map[12] = PAGE_READONLY;
|
||||
protection_map[13] = PAGE_READONLY;
|
||||
protection_map[14] = PAGE_SHARED;
|
||||
protection_map[15] = PAGE_SHARED;
|
||||
if (kernel_uses_smartmips_rixi) {
|
||||
protection_map[0] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ);
|
||||
protection_map[1] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC);
|
||||
protection_map[2] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ);
|
||||
protection_map[3] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC);
|
||||
protection_map[4] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_READ);
|
||||
protection_map[5] = __pgprot(_page_cachable_default | _PAGE_PRESENT);
|
||||
protection_map[6] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_READ);
|
||||
protection_map[7] = __pgprot(_page_cachable_default | _PAGE_PRESENT);
|
||||
|
||||
protection_map[8] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ);
|
||||
protection_map[9] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC);
|
||||
protection_map[10] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE | _PAGE_NO_READ);
|
||||
protection_map[11] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE);
|
||||
protection_map[12] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_NO_READ);
|
||||
protection_map[13] = __pgprot(_page_cachable_default | _PAGE_PRESENT);
|
||||
protection_map[14] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_WRITE | _PAGE_NO_READ);
|
||||
protection_map[15] = __pgprot(_page_cachable_default | _PAGE_PRESENT | _PAGE_WRITE);
|
||||
|
||||
} else {
|
||||
protection_map[0] = PAGE_NONE;
|
||||
protection_map[1] = PAGE_READONLY;
|
||||
protection_map[2] = PAGE_COPY;
|
||||
protection_map[3] = PAGE_COPY;
|
||||
protection_map[4] = PAGE_READONLY;
|
||||
protection_map[5] = PAGE_READONLY;
|
||||
protection_map[6] = PAGE_COPY;
|
||||
protection_map[7] = PAGE_COPY;
|
||||
protection_map[8] = PAGE_NONE;
|
||||
protection_map[9] = PAGE_READONLY;
|
||||
protection_map[10] = PAGE_SHARED;
|
||||
protection_map[11] = PAGE_SHARED;
|
||||
protection_map[12] = PAGE_READONLY;
|
||||
protection_map[13] = PAGE_READONLY;
|
||||
protection_map[14] = PAGE_SHARED;
|
||||
protection_map[15] = PAGE_SHARED;
|
||||
}
|
||||
}
|
||||
|
||||
void __cpuinit cpu_cache_init(void)
|
||||
|
@@ -99,8 +99,31 @@ good_area:
|
||||
if (!(vma->vm_flags & VM_WRITE))
|
||||
goto bad_area;
|
||||
} else {
|
||||
if (!(vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)))
|
||||
goto bad_area;
|
||||
if (kernel_uses_smartmips_rixi) {
|
||||
if (address == regs->cp0_epc && !(vma->vm_flags & VM_EXEC)) {
|
||||
#if 0
|
||||
pr_notice("Cpu%d[%s:%d:%0*lx:%ld:%0*lx] XI violation\n",
|
||||
raw_smp_processor_id(),
|
||||
current->comm, current->pid,
|
||||
field, address, write,
|
||||
field, regs->cp0_epc);
|
||||
#endif
|
||||
goto bad_area;
|
||||
}
|
||||
if (!(vma->vm_flags & VM_READ)) {
|
||||
#if 0
|
||||
pr_notice("Cpu%d[%s:%d:%0*lx:%ld:%0*lx] RI violation\n",
|
||||
raw_smp_processor_id(),
|
||||
current->comm, current->pid,
|
||||
field, address, write,
|
||||
field, regs->cp0_epc);
|
||||
#endif
|
||||
goto bad_area;
|
||||
}
|
||||
} else {
|
||||
if (!(vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)))
|
||||
goto bad_area;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -143,7 +143,7 @@ void *kmap_coherent(struct page *page, unsigned long addr)
|
||||
#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32)
|
||||
entrylo = pte.pte_high;
|
||||
#else
|
||||
entrylo = pte_val(pte) >> 6;
|
||||
entrylo = pte_to_entrylo(pte_val(pte));
|
||||
#endif
|
||||
|
||||
ENTER_CRITICAL(flags);
|
||||
|
@@ -303,7 +303,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
|
||||
unsigned long lo;
|
||||
write_c0_pagemask(PM_HUGE_MASK);
|
||||
ptep = (pte_t *)pmdp;
|
||||
lo = pte_val(*ptep) >> 6;
|
||||
lo = pte_to_entrylo(pte_val(*ptep));
|
||||
write_c0_entrylo0(lo);
|
||||
write_c0_entrylo1(lo + (HPAGE_SIZE >> 7));
|
||||
|
||||
@@ -323,8 +323,8 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
|
||||
ptep++;
|
||||
write_c0_entrylo1(ptep->pte_high);
|
||||
#else
|
||||
write_c0_entrylo0(pte_val(*ptep++) >> 6);
|
||||
write_c0_entrylo1(pte_val(*ptep) >> 6);
|
||||
write_c0_entrylo0(pte_to_entrylo(pte_val(*ptep++)));
|
||||
write_c0_entrylo1(pte_to_entrylo(pte_val(*ptep)));
|
||||
#endif
|
||||
mtc0_tlbw_hazard();
|
||||
if (idx < 0)
|
||||
@@ -437,6 +437,19 @@ void __cpuinit tlb_init(void)
|
||||
current_cpu_type() == CPU_R12000 ||
|
||||
current_cpu_type() == CPU_R14000)
|
||||
write_c0_framemask(0);
|
||||
|
||||
if (kernel_uses_smartmips_rixi) {
|
||||
/*
|
||||
* Enable the no read, no exec bits, and enable large virtual
|
||||
* address.
|
||||
*/
|
||||
u32 pg = PG_RIE | PG_XIE;
|
||||
#ifdef CONFIG_64BIT
|
||||
pg |= PG_ELPA;
|
||||
#endif
|
||||
write_c0_pagegrain(pg);
|
||||
}
|
||||
|
||||
temp_tlb_entry = current_cpu_data.tlbsize - 1;
|
||||
|
||||
/* From this point on the ARC firmware is dead. */
|
||||
|
@@ -76,6 +76,8 @@ enum label_id {
|
||||
label_vmalloc_done,
|
||||
label_tlbw_hazard,
|
||||
label_split,
|
||||
label_tlbl_goaround1,
|
||||
label_tlbl_goaround2,
|
||||
label_nopage_tlbl,
|
||||
label_nopage_tlbs,
|
||||
label_nopage_tlbm,
|
||||
@@ -92,6 +94,8 @@ UASM_L_LA(_vmalloc)
|
||||
UASM_L_LA(_vmalloc_done)
|
||||
UASM_L_LA(_tlbw_hazard)
|
||||
UASM_L_LA(_split)
|
||||
UASM_L_LA(_tlbl_goaround1)
|
||||
UASM_L_LA(_tlbl_goaround2)
|
||||
UASM_L_LA(_nopage_tlbl)
|
||||
UASM_L_LA(_nopage_tlbs)
|
||||
UASM_L_LA(_nopage_tlbm)
|
||||
@@ -396,7 +400,44 @@ static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l,
|
||||
}
|
||||
}
|
||||
|
||||
static __cpuinit __maybe_unused void build_convert_pte_to_entrylo(u32 **p,
|
||||
unsigned int reg)
|
||||
{
|
||||
if (kernel_uses_smartmips_rixi) {
|
||||
UASM_i_SRL(p, reg, reg, ilog2(_PAGE_NO_EXEC));
|
||||
UASM_i_ROTR(p, reg, reg, ilog2(_PAGE_GLOBAL) - ilog2(_PAGE_NO_EXEC));
|
||||
} else {
|
||||
#ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
uasm_i_dsrl(p, reg, reg, ilog2(_PAGE_GLOBAL));
|
||||
#else
|
||||
UASM_i_SRL(p, reg, reg, ilog2(_PAGE_GLOBAL));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
|
||||
static __cpuinit void build_restore_pagemask(u32 **p,
|
||||
struct uasm_reloc **r,
|
||||
unsigned int tmp,
|
||||
enum label_id lid)
|
||||
{
|
||||
/* Reset default page size */
|
||||
if (PM_DEFAULT_MASK >> 16) {
|
||||
uasm_i_lui(p, tmp, PM_DEFAULT_MASK >> 16);
|
||||
uasm_i_ori(p, tmp, tmp, PM_DEFAULT_MASK & 0xffff);
|
||||
uasm_il_b(p, r, lid);
|
||||
uasm_i_mtc0(p, tmp, C0_PAGEMASK);
|
||||
} else if (PM_DEFAULT_MASK) {
|
||||
uasm_i_ori(p, tmp, 0, PM_DEFAULT_MASK);
|
||||
uasm_il_b(p, r, lid);
|
||||
uasm_i_mtc0(p, tmp, C0_PAGEMASK);
|
||||
} else {
|
||||
uasm_il_b(p, r, lid);
|
||||
uasm_i_mtc0(p, 0, C0_PAGEMASK);
|
||||
}
|
||||
}
|
||||
|
||||
static __cpuinit void build_huge_tlb_write_entry(u32 **p,
|
||||
struct uasm_label **l,
|
||||
struct uasm_reloc **r,
|
||||
@@ -410,20 +451,7 @@ static __cpuinit void build_huge_tlb_write_entry(u32 **p,
|
||||
|
||||
build_tlb_write_entry(p, l, r, wmode);
|
||||
|
||||
/* Reset default page size */
|
||||
if (PM_DEFAULT_MASK >> 16) {
|
||||
uasm_i_lui(p, tmp, PM_DEFAULT_MASK >> 16);
|
||||
uasm_i_ori(p, tmp, tmp, PM_DEFAULT_MASK & 0xffff);
|
||||
uasm_il_b(p, r, label_leave);
|
||||
uasm_i_mtc0(p, tmp, C0_PAGEMASK);
|
||||
} else if (PM_DEFAULT_MASK) {
|
||||
uasm_i_ori(p, tmp, 0, PM_DEFAULT_MASK);
|
||||
uasm_il_b(p, r, label_leave);
|
||||
uasm_i_mtc0(p, tmp, C0_PAGEMASK);
|
||||
} else {
|
||||
uasm_il_b(p, r, label_leave);
|
||||
uasm_i_mtc0(p, 0, C0_PAGEMASK);
|
||||
}
|
||||
build_restore_pagemask(p, r, tmp, label_leave);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -459,7 +487,7 @@ static __cpuinit void build_huge_update_entries(u32 **p,
|
||||
if (!small_sequence)
|
||||
uasm_i_lui(p, tmp, HPAGE_SIZE >> (7 + 16));
|
||||
|
||||
UASM_i_SRL(p, pte, pte, 6); /* convert to entrylo */
|
||||
build_convert_pte_to_entrylo(p, pte);
|
||||
UASM_i_MTC0(p, pte, C0_ENTRYLO0); /* load it */
|
||||
/* convert to entrylo1 */
|
||||
if (small_sequence)
|
||||
@@ -685,9 +713,17 @@ static void __cpuinit build_update_entries(u32 **p, unsigned int tmp,
|
||||
if (cpu_has_64bits) {
|
||||
uasm_i_ld(p, tmp, 0, ptep); /* get even pte */
|
||||
uasm_i_ld(p, ptep, sizeof(pte_t), ptep); /* get odd pte */
|
||||
uasm_i_dsrl(p, tmp, tmp, 6); /* convert to entrylo0 */
|
||||
UASM_i_MTC0(p, tmp, C0_ENTRYLO0); /* load it */
|
||||
uasm_i_dsrl(p, ptep, ptep, 6); /* convert to entrylo1 */
|
||||
if (kernel_uses_smartmips_rixi) {
|
||||
UASM_i_SRL(p, tmp, tmp, ilog2(_PAGE_NO_EXEC));
|
||||
UASM_i_SRL(p, ptep, ptep, ilog2(_PAGE_NO_EXEC));
|
||||
UASM_i_ROTR(p, tmp, tmp, ilog2(_PAGE_GLOBAL) - ilog2(_PAGE_NO_EXEC));
|
||||
UASM_i_MTC0(p, tmp, C0_ENTRYLO0); /* load it */
|
||||
UASM_i_ROTR(p, ptep, ptep, ilog2(_PAGE_GLOBAL) - ilog2(_PAGE_NO_EXEC));
|
||||
} else {
|
||||
uasm_i_dsrl(p, tmp, tmp, ilog2(_PAGE_GLOBAL)); /* convert to entrylo0 */
|
||||
UASM_i_MTC0(p, tmp, C0_ENTRYLO0); /* load it */
|
||||
uasm_i_dsrl(p, ptep, ptep, ilog2(_PAGE_GLOBAL)); /* convert to entrylo1 */
|
||||
}
|
||||
UASM_i_MTC0(p, ptep, C0_ENTRYLO1); /* load it */
|
||||
} else {
|
||||
int pte_off_even = sizeof(pte_t) / 2;
|
||||
@@ -704,13 +740,23 @@ static void __cpuinit build_update_entries(u32 **p, unsigned int tmp,
|
||||
UASM_i_LW(p, ptep, sizeof(pte_t), ptep); /* get odd pte */
|
||||
if (r45k_bvahwbug())
|
||||
build_tlb_probe_entry(p);
|
||||
UASM_i_SRL(p, tmp, tmp, 6); /* convert to entrylo0 */
|
||||
if (r4k_250MHZhwbug())
|
||||
UASM_i_MTC0(p, 0, C0_ENTRYLO0);
|
||||
UASM_i_MTC0(p, tmp, C0_ENTRYLO0); /* load it */
|
||||
UASM_i_SRL(p, ptep, ptep, 6); /* convert to entrylo1 */
|
||||
if (r45k_bvahwbug())
|
||||
uasm_i_mfc0(p, tmp, C0_INDEX);
|
||||
if (kernel_uses_smartmips_rixi) {
|
||||
UASM_i_SRL(p, tmp, tmp, ilog2(_PAGE_NO_EXEC));
|
||||
UASM_i_SRL(p, ptep, ptep, ilog2(_PAGE_NO_EXEC));
|
||||
UASM_i_ROTR(p, tmp, tmp, ilog2(_PAGE_GLOBAL) - ilog2(_PAGE_NO_EXEC));
|
||||
if (r4k_250MHZhwbug())
|
||||
UASM_i_MTC0(p, 0, C0_ENTRYLO0);
|
||||
UASM_i_MTC0(p, tmp, C0_ENTRYLO0); /* load it */
|
||||
UASM_i_ROTR(p, ptep, ptep, ilog2(_PAGE_GLOBAL) - ilog2(_PAGE_NO_EXEC));
|
||||
} else {
|
||||
UASM_i_SRL(p, tmp, tmp, ilog2(_PAGE_GLOBAL)); /* convert to entrylo0 */
|
||||
if (r4k_250MHZhwbug())
|
||||
UASM_i_MTC0(p, 0, C0_ENTRYLO0);
|
||||
UASM_i_MTC0(p, tmp, C0_ENTRYLO0); /* load it */
|
||||
UASM_i_SRL(p, ptep, ptep, ilog2(_PAGE_GLOBAL)); /* convert to entrylo1 */
|
||||
if (r45k_bvahwbug())
|
||||
uasm_i_mfc0(p, tmp, C0_INDEX);
|
||||
}
|
||||
if (r4k_250MHZhwbug())
|
||||
UASM_i_MTC0(p, 0, C0_ENTRYLO1);
|
||||
UASM_i_MTC0(p, ptep, C0_ENTRYLO1); /* load it */
|
||||
@@ -986,9 +1032,14 @@ static void __cpuinit
|
||||
build_pte_present(u32 **p, struct uasm_reloc **r,
|
||||
unsigned int pte, unsigned int ptr, enum label_id lid)
|
||||
{
|
||||
uasm_i_andi(p, pte, pte, _PAGE_PRESENT | _PAGE_READ);
|
||||
uasm_i_xori(p, pte, pte, _PAGE_PRESENT | _PAGE_READ);
|
||||
uasm_il_bnez(p, r, pte, lid);
|
||||
if (kernel_uses_smartmips_rixi) {
|
||||
uasm_i_andi(p, pte, pte, _PAGE_PRESENT);
|
||||
uasm_il_beqz(p, r, pte, lid);
|
||||
} else {
|
||||
uasm_i_andi(p, pte, pte, _PAGE_PRESENT | _PAGE_READ);
|
||||
uasm_i_xori(p, pte, pte, _PAGE_PRESENT | _PAGE_READ);
|
||||
uasm_il_bnez(p, r, pte, lid);
|
||||
}
|
||||
iPTE_LW(p, pte, ptr);
|
||||
}
|
||||
|
||||
@@ -1273,6 +1324,34 @@ static void __cpuinit build_r4000_tlb_load_handler(void)
|
||||
build_pte_present(&p, &r, K0, K1, label_nopage_tlbl);
|
||||
if (m4kc_tlbp_war())
|
||||
build_tlb_probe_entry(&p);
|
||||
|
||||
if (kernel_uses_smartmips_rixi) {
|
||||
/*
|
||||
* If the page is not _PAGE_VALID, RI or XI could not
|
||||
* have triggered it. Skip the expensive test..
|
||||
*/
|
||||
uasm_i_andi(&p, K0, K0, _PAGE_VALID);
|
||||
uasm_il_beqz(&p, &r, K0, label_tlbl_goaround1);
|
||||
uasm_i_nop(&p);
|
||||
|
||||
uasm_i_tlbr(&p);
|
||||
/* Examine entrylo 0 or 1 based on ptr. */
|
||||
uasm_i_andi(&p, K0, K1, sizeof(pte_t));
|
||||
uasm_i_beqz(&p, K0, 8);
|
||||
|
||||
UASM_i_MFC0(&p, K0, C0_ENTRYLO0); /* load it in the delay slot*/
|
||||
UASM_i_MFC0(&p, K0, C0_ENTRYLO1); /* load it if ptr is odd */
|
||||
/*
|
||||
* If the entryLo (now in K0) is valid (bit 1), RI or
|
||||
* XI must have triggered it.
|
||||
*/
|
||||
uasm_i_andi(&p, K0, K0, 2);
|
||||
uasm_il_bnez(&p, &r, K0, label_nopage_tlbl);
|
||||
|
||||
uasm_l_tlbl_goaround1(&l, p);
|
||||
/* Reload the PTE value */
|
||||
iPTE_LW(&p, K0, K1);
|
||||
}
|
||||
build_make_valid(&p, &r, K0, K1);
|
||||
build_r4000_tlbchange_handler_tail(&p, &l, &r, K0, K1);
|
||||
|
||||
@@ -1285,6 +1364,40 @@ static void __cpuinit build_r4000_tlb_load_handler(void)
|
||||
iPTE_LW(&p, K0, K1);
|
||||
build_pte_present(&p, &r, K0, K1, label_nopage_tlbl);
|
||||
build_tlb_probe_entry(&p);
|
||||
|
||||
if (kernel_uses_smartmips_rixi) {
|
||||
/*
|
||||
* If the page is not _PAGE_VALID, RI or XI could not
|
||||
* have triggered it. Skip the expensive test..
|
||||
*/
|
||||
uasm_i_andi(&p, K0, K0, _PAGE_VALID);
|
||||
uasm_il_beqz(&p, &r, K0, label_tlbl_goaround2);
|
||||
uasm_i_nop(&p);
|
||||
|
||||
uasm_i_tlbr(&p);
|
||||
/* Examine entrylo 0 or 1 based on ptr. */
|
||||
uasm_i_andi(&p, K0, K1, sizeof(pte_t));
|
||||
uasm_i_beqz(&p, K0, 8);
|
||||
|
||||
UASM_i_MFC0(&p, K0, C0_ENTRYLO0); /* load it in the delay slot*/
|
||||
UASM_i_MFC0(&p, K0, C0_ENTRYLO1); /* load it if ptr is odd */
|
||||
/*
|
||||
* If the entryLo (now in K0) is valid (bit 1), RI or
|
||||
* XI must have triggered it.
|
||||
*/
|
||||
uasm_i_andi(&p, K0, K0, 2);
|
||||
uasm_il_beqz(&p, &r, K0, label_tlbl_goaround2);
|
||||
/* Reload the PTE value */
|
||||
iPTE_LW(&p, K0, K1);
|
||||
|
||||
/*
|
||||
* We clobbered C0_PAGEMASK, restore it. On the other branch
|
||||
* it is restored in build_huge_tlb_write_entry.
|
||||
*/
|
||||
build_restore_pagemask(&p, &r, K0, label_nopage_tlbl);
|
||||
|
||||
uasm_l_tlbl_goaround2(&l, p);
|
||||
}
|
||||
uasm_i_ori(&p, K0, K0, (_PAGE_ACCESSED | _PAGE_VALID));
|
||||
build_huge_handler_tail(&p, &r, &l, K0, K1);
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user