1d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */ 21da177e4SLinus Torvalds/* 31da177e4SLinus Torvalds * linux/arch/arm/mm/tlb-v6.S 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Copyright (C) 1997-2002 Russell King 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * ARM architecture version 6 TLB handling functions. 81da177e4SLinus Torvalds * These assume a split I/D TLB. 91da177e4SLinus Torvalds */ 10991da17eSTim Abbott#include <linux/init.h> 111da177e4SLinus Torvalds#include <linux/linkage.h> 12e6ae744dSSam Ravnborg#include <asm/asm-offsets.h> 136ebbf2ceSRussell King#include <asm/assembler.h> 141da177e4SLinus Torvalds#include <asm/page.h> 151da177e4SLinus Torvalds#include <asm/tlbflush.h> 161da177e4SLinus Torvalds#include "proc-macros.S" 171da177e4SLinus Torvalds 181da177e4SLinus Torvalds#define HARVARD_TLB 191da177e4SLinus Torvalds 20*a2faac39SNick Desaulniers.arch armv6 21*a2faac39SNick Desaulniers 221da177e4SLinus Torvalds/* 231da177e4SLinus Torvalds * v6wbi_flush_user_tlb_range(start, end, vma) 241da177e4SLinus Torvalds * 251da177e4SLinus Torvalds * Invalidate a range of TLB entries in the specified address space. 261da177e4SLinus Torvalds * 271da177e4SLinus Torvalds * - start - start address (may not be aligned) 281da177e4SLinus Torvalds * - end - end address (exclusive, may not be aligned) 295673a60bSChen Li * - vma - vm_area_struct describing address range 301da177e4SLinus Torvalds * 311da177e4SLinus Torvalds * It is assumed that: 321da177e4SLinus Torvalds * - the "Invalidate single entry" instruction will invalidate 331da177e4SLinus Torvalds * both the I and the D TLBs on Harvard-style TLBs 341da177e4SLinus Torvalds */ 351da177e4SLinus TorvaldsENTRY(v6wbi_flush_user_tlb_range) 361da177e4SLinus Torvalds vma_vm_mm r3, r2 @ get vma->vm_mm 371da177e4SLinus Torvalds mov ip, #0 381da177e4SLinus Torvalds mmid r3, r3 @ get vm_mm->context.id 391da177e4SLinus Torvalds mcr p15, 0, ip, c7, c10, 4 @ drain write buffer 401da177e4SLinus Torvalds mov r0, r0, lsr #PAGE_SHIFT @ align address 411da177e4SLinus Torvalds mov r1, r1, lsr #PAGE_SHIFT 421da177e4SLinus Torvalds asid r3, r3 @ mask ASID 431da177e4SLinus Torvalds orr r0, r3, r0, lsl #PAGE_SHIFT @ Create initial MVA 441da177e4SLinus Torvalds mov r1, r1, lsl #PAGE_SHIFT 451da177e4SLinus Torvalds vma_vm_flags r2, r2 @ get vma->vm_flags 461da177e4SLinus Torvalds1: 471da177e4SLinus Torvalds#ifdef HARVARD_TLB 481da177e4SLinus Torvalds mcr p15, 0, r0, c8, c6, 1 @ TLB invalidate D MVA (was 1) 491da177e4SLinus Torvalds tst r2, #VM_EXEC @ Executable area ? 501da177e4SLinus Torvalds mcrne p15, 0, r0, c8, c5, 1 @ TLB invalidate I MVA (was 1) 511da177e4SLinus Torvalds#else 521da177e4SLinus Torvalds mcr p15, 0, r0, c8, c7, 1 @ TLB invalidate MVA (was 1) 531da177e4SLinus Torvalds#endif 541da177e4SLinus Torvalds add r0, r0, #PAGE_SZ 551da177e4SLinus Torvalds cmp r0, r1 561da177e4SLinus Torvalds blo 1b 57e6a5d66fSCatalin Marinas mcr p15, 0, ip, c7, c10, 4 @ data synchronization barrier 586ebbf2ceSRussell King ret lr 591da177e4SLinus Torvalds 601da177e4SLinus Torvalds/* 611da177e4SLinus Torvalds * v6wbi_flush_kern_tlb_range(start,end) 621da177e4SLinus Torvalds * 631da177e4SLinus Torvalds * Invalidate a range of kernel TLB entries 641da177e4SLinus Torvalds * 651da177e4SLinus Torvalds * - start - start address (may not be aligned) 661da177e4SLinus Torvalds * - end - end address (exclusive, may not be aligned) 671da177e4SLinus Torvalds */ 681da177e4SLinus TorvaldsENTRY(v6wbi_flush_kern_tlb_range) 691da177e4SLinus Torvalds mov r2, #0 701da177e4SLinus Torvalds mcr p15, 0, r2, c7, c10, 4 @ drain write buffer 711da177e4SLinus Torvalds mov r0, r0, lsr #PAGE_SHIFT @ align address 721da177e4SLinus Torvalds mov r1, r1, lsr #PAGE_SHIFT 731da177e4SLinus Torvalds mov r0, r0, lsl #PAGE_SHIFT 741da177e4SLinus Torvalds mov r1, r1, lsl #PAGE_SHIFT 751da177e4SLinus Torvalds1: 761da177e4SLinus Torvalds#ifdef HARVARD_TLB 771da177e4SLinus Torvalds mcr p15, 0, r0, c8, c6, 1 @ TLB invalidate D MVA 781da177e4SLinus Torvalds mcr p15, 0, r0, c8, c5, 1 @ TLB invalidate I MVA 791da177e4SLinus Torvalds#else 801da177e4SLinus Torvalds mcr p15, 0, r0, c8, c7, 1 @ TLB invalidate MVA 811da177e4SLinus Torvalds#endif 821da177e4SLinus Torvalds add r0, r0, #PAGE_SZ 831da177e4SLinus Torvalds cmp r0, r1 841da177e4SLinus Torvalds blo 1b 856a0e2430SCatalin Marinas mcr p15, 0, r2, c7, c10, 4 @ data synchronization barrier 864348810aSRussell King mcr p15, 0, r2, c7, c5, 4 @ prefetch flush (isb) 876ebbf2ceSRussell King ret lr 881da177e4SLinus Torvalds 89991da17eSTim Abbott __INIT 901da177e4SLinus Torvalds 913b7f39faSDave Martin /* define struct cpu_tlb_fns (see <asm/tlbflush.h> and proc-macros.S) */ 923b7f39faSDave Martin define_tlb_functions v6wbi, v6wbi_tlb_flags 93