1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 227137e52SSam Ravnborg/* 327137e52SSam Ravnborg * ultra.S: Don't expand these all over the place... 427137e52SSam Ravnborg * 527137e52SSam Ravnborg * Copyright (C) 1997, 2000, 2008 David S. Miller (davem@davemloft.net) 627137e52SSam Ravnborg */ 727137e52SSam Ravnborg 8ca5999fdSMike Rapoport#include <linux/pgtable.h> 9*65fddcfcSMike Rapoport#include <asm/asi.h> 1027137e52SSam Ravnborg#include <asm/page.h> 1127137e52SSam Ravnborg#include <asm/spitfire.h> 1227137e52SSam Ravnborg#include <asm/mmu_context.h> 1327137e52SSam Ravnborg#include <asm/mmu.h> 1427137e52SSam Ravnborg#include <asm/pil.h> 1527137e52SSam Ravnborg#include <asm/head.h> 1627137e52SSam Ravnborg#include <asm/thread_info.h> 1727137e52SSam Ravnborg#include <asm/cacheflush.h> 1827137e52SSam Ravnborg#include <asm/hypervisor.h> 1927137e52SSam Ravnborg#include <asm/cpudata.h> 2027137e52SSam Ravnborg 2127137e52SSam Ravnborg /* Basically, most of the Spitfire vs. Cheetah madness 2227137e52SSam Ravnborg * has to do with the fact that Cheetah does not support 2327137e52SSam Ravnborg * IMMU flushes out of the secondary context. Someone needs 2427137e52SSam Ravnborg * to throw a south lake birthday party for the folks 2527137e52SSam Ravnborg * in Microelectronics who refused to fix this shit. 2627137e52SSam Ravnborg */ 2727137e52SSam Ravnborg 2827137e52SSam Ravnborg /* This file is meant to be read efficiently by the CPU, not humans. 2927137e52SSam Ravnborg * Staraj sie tego nikomu nie pierdolnac... 3027137e52SSam Ravnborg */ 3127137e52SSam Ravnborg .text 3227137e52SSam Ravnborg .align 32 3327137e52SSam Ravnborg .globl __flush_tlb_mm 34b429ae4dSDavid S. Miller__flush_tlb_mm: /* 19 insns */ 3527137e52SSam Ravnborg /* %o0=(ctx & TAG_CONTEXT_BITS), %o1=SECONDARY_CONTEXT */ 3627137e52SSam Ravnborg ldxa [%o1] ASI_DMMU, %g2 3727137e52SSam Ravnborg cmp %g2, %o0 3827137e52SSam Ravnborg bne,pn %icc, __spitfire_flush_tlb_mm_slow 3927137e52SSam Ravnborg mov 0x50, %g3 4027137e52SSam Ravnborg stxa %g0, [%g3] ASI_DMMU_DEMAP 4127137e52SSam Ravnborg stxa %g0, [%g3] ASI_IMMU_DEMAP 4227137e52SSam Ravnborg sethi %hi(KERNBASE), %g3 4327137e52SSam Ravnborg flush %g3 4427137e52SSam Ravnborg retl 4527137e52SSam Ravnborg nop 4627137e52SSam Ravnborg nop 4727137e52SSam Ravnborg nop 4827137e52SSam Ravnborg nop 4927137e52SSam Ravnborg nop 5027137e52SSam Ravnborg nop 5127137e52SSam Ravnborg nop 5227137e52SSam Ravnborg nop 5327137e52SSam Ravnborg nop 5427137e52SSam Ravnborg nop 5527137e52SSam Ravnborg 5627137e52SSam Ravnborg .align 32 57f36391d2SDavid S. Miller .globl __flush_tlb_page 58f36391d2SDavid S. Miller__flush_tlb_page: /* 22 insns */ 59f36391d2SDavid S. Miller /* %o0 = context, %o1 = vaddr */ 60f36391d2SDavid S. Miller rdpr %pstate, %g7 61f36391d2SDavid S. Miller andn %g7, PSTATE_IE, %g2 62f36391d2SDavid S. Miller wrpr %g2, %pstate 63f36391d2SDavid S. Miller mov SECONDARY_CONTEXT, %o4 64f36391d2SDavid S. Miller ldxa [%o4] ASI_DMMU, %g2 65f36391d2SDavid S. Miller stxa %o0, [%o4] ASI_DMMU 66f36391d2SDavid S. Miller andcc %o1, 1, %g0 67f36391d2SDavid S. Miller andn %o1, 1, %o3 68f36391d2SDavid S. Miller be,pn %icc, 1f 69f36391d2SDavid S. Miller or %o3, 0x10, %o3 70f36391d2SDavid S. Miller stxa %g0, [%o3] ASI_IMMU_DEMAP 71f36391d2SDavid S. Miller1: stxa %g0, [%o3] ASI_DMMU_DEMAP 72f36391d2SDavid S. Miller membar #Sync 73f36391d2SDavid S. Miller stxa %g2, [%o4] ASI_DMMU 74f36391d2SDavid S. Miller sethi %hi(KERNBASE), %o4 75f36391d2SDavid S. Miller flush %o4 76f36391d2SDavid S. Miller retl 77f36391d2SDavid S. Miller wrpr %g7, 0x0, %pstate 78f36391d2SDavid S. Miller nop 79f36391d2SDavid S. Miller nop 80f36391d2SDavid S. Miller nop 81f36391d2SDavid S. Miller nop 82f36391d2SDavid S. Miller 83f36391d2SDavid S. Miller .align 32 8427137e52SSam Ravnborg .globl __flush_tlb_pending 85b429ae4dSDavid S. Miller__flush_tlb_pending: /* 27 insns */ 8627137e52SSam Ravnborg /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */ 8727137e52SSam Ravnborg rdpr %pstate, %g7 8827137e52SSam Ravnborg sllx %o1, 3, %o1 8927137e52SSam Ravnborg andn %g7, PSTATE_IE, %g2 9027137e52SSam Ravnborg wrpr %g2, %pstate 9127137e52SSam Ravnborg mov SECONDARY_CONTEXT, %o4 9227137e52SSam Ravnborg ldxa [%o4] ASI_DMMU, %g2 9327137e52SSam Ravnborg stxa %o0, [%o4] ASI_DMMU 9427137e52SSam Ravnborg1: sub %o1, (1 << 3), %o1 9527137e52SSam Ravnborg ldx [%o2 + %o1], %o3 9627137e52SSam Ravnborg andcc %o3, 1, %g0 9727137e52SSam Ravnborg andn %o3, 1, %o3 9827137e52SSam Ravnborg be,pn %icc, 2f 9927137e52SSam Ravnborg or %o3, 0x10, %o3 10027137e52SSam Ravnborg stxa %g0, [%o3] ASI_IMMU_DEMAP 10127137e52SSam Ravnborg2: stxa %g0, [%o3] ASI_DMMU_DEMAP 10227137e52SSam Ravnborg membar #Sync 10327137e52SSam Ravnborg brnz,pt %o1, 1b 10427137e52SSam Ravnborg nop 10527137e52SSam Ravnborg stxa %g2, [%o4] ASI_DMMU 10627137e52SSam Ravnborg sethi %hi(KERNBASE), %o4 10727137e52SSam Ravnborg flush %o4 10827137e52SSam Ravnborg retl 10927137e52SSam Ravnborg wrpr %g7, 0x0, %pstate 11027137e52SSam Ravnborg nop 11127137e52SSam Ravnborg nop 11227137e52SSam Ravnborg nop 11327137e52SSam Ravnborg nop 11427137e52SSam Ravnborg 11527137e52SSam Ravnborg .align 32 11627137e52SSam Ravnborg .globl __flush_tlb_kernel_range 117a74ad5e6SDavid S. Miller__flush_tlb_kernel_range: /* 31 insns */ 11827137e52SSam Ravnborg /* %o0=start, %o1=end */ 11927137e52SSam Ravnborg cmp %o0, %o1 12027137e52SSam Ravnborg be,pn %xcc, 2f 12127137e52SSam Ravnborg sub %o1, %o0, %o3 122a74ad5e6SDavid S. Miller srlx %o3, 18, %o4 123a74ad5e6SDavid S. Miller brnz,pn %o4, __spitfire_flush_tlb_kernel_range_slow 124a74ad5e6SDavid S. Miller sethi %hi(PAGE_SIZE), %o4 12527137e52SSam Ravnborg sub %o3, %o4, %o3 12627137e52SSam Ravnborg or %o0, 0x20, %o0 ! Nucleus 12727137e52SSam Ravnborg1: stxa %g0, [%o0 + %o3] ASI_DMMU_DEMAP 12827137e52SSam Ravnborg stxa %g0, [%o0 + %o3] ASI_IMMU_DEMAP 12927137e52SSam Ravnborg membar #Sync 13027137e52SSam Ravnborg brnz,pt %o3, 1b 13127137e52SSam Ravnborg sub %o3, %o4, %o3 13227137e52SSam Ravnborg2: sethi %hi(KERNBASE), %o3 13327137e52SSam Ravnborg flush %o3 13427137e52SSam Ravnborg retl 13527137e52SSam Ravnborg nop 13627137e52SSam Ravnborg nop 137b429ae4dSDavid S. Miller nop 138b429ae4dSDavid S. Miller nop 139b429ae4dSDavid S. Miller nop 140a74ad5e6SDavid S. Miller nop 141a74ad5e6SDavid S. Miller nop 142a74ad5e6SDavid S. Miller nop 143a74ad5e6SDavid S. Miller nop 144a74ad5e6SDavid S. Miller nop 145a74ad5e6SDavid S. Miller nop 146a74ad5e6SDavid S. Miller nop 147a74ad5e6SDavid S. Miller nop 148a74ad5e6SDavid S. Miller nop 149a74ad5e6SDavid S. Miller nop 150a74ad5e6SDavid S. Miller 151a74ad5e6SDavid S. Miller__spitfire_flush_tlb_kernel_range_slow: 152a74ad5e6SDavid S. Miller mov 63 * 8, %o4 153a74ad5e6SDavid S. Miller1: ldxa [%o4] ASI_ITLB_DATA_ACCESS, %o3 154a74ad5e6SDavid S. Miller andcc %o3, 0x40, %g0 /* _PAGE_L_4U */ 155a74ad5e6SDavid S. Miller bne,pn %xcc, 2f 156a74ad5e6SDavid S. Miller mov TLB_TAG_ACCESS, %o3 157a74ad5e6SDavid S. Miller stxa %g0, [%o3] ASI_IMMU 158a74ad5e6SDavid S. Miller stxa %g0, [%o4] ASI_ITLB_DATA_ACCESS 159a74ad5e6SDavid S. Miller membar #Sync 160a74ad5e6SDavid S. Miller2: ldxa [%o4] ASI_DTLB_DATA_ACCESS, %o3 161a74ad5e6SDavid S. Miller andcc %o3, 0x40, %g0 162a74ad5e6SDavid S. Miller bne,pn %xcc, 2f 163a74ad5e6SDavid S. Miller mov TLB_TAG_ACCESS, %o3 164a74ad5e6SDavid S. Miller stxa %g0, [%o3] ASI_DMMU 165a74ad5e6SDavid S. Miller stxa %g0, [%o4] ASI_DTLB_DATA_ACCESS 166a74ad5e6SDavid S. Miller membar #Sync 167a74ad5e6SDavid S. Miller2: sub %o4, 8, %o4 168a74ad5e6SDavid S. Miller brgez,pt %o4, 1b 169a74ad5e6SDavid S. Miller nop 170a74ad5e6SDavid S. Miller retl 171a74ad5e6SDavid S. Miller nop 17227137e52SSam Ravnborg 17327137e52SSam Ravnborg__spitfire_flush_tlb_mm_slow: 17427137e52SSam Ravnborg rdpr %pstate, %g1 17527137e52SSam Ravnborg wrpr %g1, PSTATE_IE, %pstate 17627137e52SSam Ravnborg stxa %o0, [%o1] ASI_DMMU 17727137e52SSam Ravnborg stxa %g0, [%g3] ASI_DMMU_DEMAP 17827137e52SSam Ravnborg stxa %g0, [%g3] ASI_IMMU_DEMAP 17927137e52SSam Ravnborg flush %g6 18027137e52SSam Ravnborg stxa %g2, [%o1] ASI_DMMU 18127137e52SSam Ravnborg sethi %hi(KERNBASE), %o1 18227137e52SSam Ravnborg flush %o1 18327137e52SSam Ravnborg retl 18427137e52SSam Ravnborg wrpr %g1, 0, %pstate 18527137e52SSam Ravnborg 18627137e52SSam Ravnborg/* 18727137e52SSam Ravnborg * The following code flushes one page_size worth. 18827137e52SSam Ravnborg */ 18927137e52SSam Ravnborg .section .kprobes.text, "ax" 19027137e52SSam Ravnborg .align 32 19127137e52SSam Ravnborg .globl __flush_icache_page 19227137e52SSam Ravnborg__flush_icache_page: /* %o0 = phys_page */ 19327137e52SSam Ravnborg srlx %o0, PAGE_SHIFT, %o0 194b2d43834SDavid S. Miller sethi %hi(PAGE_OFFSET), %g1 19527137e52SSam Ravnborg sllx %o0, PAGE_SHIFT, %o0 19627137e52SSam Ravnborg sethi %hi(PAGE_SIZE), %g2 197b2d43834SDavid S. Miller ldx [%g1 + %lo(PAGE_OFFSET)], %g1 19827137e52SSam Ravnborg add %o0, %g1, %o0 19927137e52SSam Ravnborg1: subcc %g2, 32, %g2 20027137e52SSam Ravnborg bne,pt %icc, 1b 20127137e52SSam Ravnborg flush %o0 + %g2 20227137e52SSam Ravnborg retl 20327137e52SSam Ravnborg nop 20427137e52SSam Ravnborg 20527137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE 20627137e52SSam Ravnborg 20727137e52SSam Ravnborg#if (PAGE_SHIFT != 13) 20827137e52SSam Ravnborg#error only page shift of 13 is supported by dcache flush 20927137e52SSam Ravnborg#endif 21027137e52SSam Ravnborg 21127137e52SSam Ravnborg#define DTAG_MASK 0x3 21227137e52SSam Ravnborg 21327137e52SSam Ravnborg /* This routine is Spitfire specific so the hardcoded 21427137e52SSam Ravnborg * D-cache size and line-size are OK. 21527137e52SSam Ravnborg */ 21627137e52SSam Ravnborg .align 64 21727137e52SSam Ravnborg .globl __flush_dcache_page 21827137e52SSam Ravnborg__flush_dcache_page: /* %o0=kaddr, %o1=flush_icache */ 219b2d43834SDavid S. Miller sethi %hi(PAGE_OFFSET), %g1 220b2d43834SDavid S. Miller ldx [%g1 + %lo(PAGE_OFFSET)], %g1 22127137e52SSam Ravnborg sub %o0, %g1, %o0 ! physical address 22227137e52SSam Ravnborg srlx %o0, 11, %o0 ! make D-cache TAG 22327137e52SSam Ravnborg sethi %hi(1 << 14), %o2 ! D-cache size 22427137e52SSam Ravnborg sub %o2, (1 << 5), %o2 ! D-cache line size 22527137e52SSam Ravnborg1: ldxa [%o2] ASI_DCACHE_TAG, %o3 ! load D-cache TAG 22627137e52SSam Ravnborg andcc %o3, DTAG_MASK, %g0 ! Valid? 22727137e52SSam Ravnborg be,pn %xcc, 2f ! Nope, branch 22827137e52SSam Ravnborg andn %o3, DTAG_MASK, %o3 ! Clear valid bits 22927137e52SSam Ravnborg cmp %o3, %o0 ! TAG match? 23027137e52SSam Ravnborg bne,pt %xcc, 2f ! Nope, branch 23127137e52SSam Ravnborg nop 23227137e52SSam Ravnborg stxa %g0, [%o2] ASI_DCACHE_TAG ! Invalidate TAG 23327137e52SSam Ravnborg membar #Sync 23427137e52SSam Ravnborg2: brnz,pt %o2, 1b 23527137e52SSam Ravnborg sub %o2, (1 << 5), %o2 ! D-cache line size 23627137e52SSam Ravnborg 23727137e52SSam Ravnborg /* The I-cache does not snoop local stores so we 23827137e52SSam Ravnborg * better flush that too when necessary. 23927137e52SSam Ravnborg */ 24027137e52SSam Ravnborg brnz,pt %o1, __flush_icache_page 24127137e52SSam Ravnborg sllx %o0, 11, %o0 24227137e52SSam Ravnborg retl 24327137e52SSam Ravnborg nop 24427137e52SSam Ravnborg 24527137e52SSam Ravnborg#endif /* DCACHE_ALIASING_POSSIBLE */ 24627137e52SSam Ravnborg 24727137e52SSam Ravnborg .previous 24827137e52SSam Ravnborg 24927137e52SSam Ravnborg /* Cheetah specific versions, patched at boot time. */ 25027137e52SSam Ravnborg__cheetah_flush_tlb_mm: /* 19 insns */ 25127137e52SSam Ravnborg rdpr %pstate, %g7 25227137e52SSam Ravnborg andn %g7, PSTATE_IE, %g2 25327137e52SSam Ravnborg wrpr %g2, 0x0, %pstate 25427137e52SSam Ravnborg wrpr %g0, 1, %tl 25527137e52SSam Ravnborg mov PRIMARY_CONTEXT, %o2 25627137e52SSam Ravnborg mov 0x40, %g3 25727137e52SSam Ravnborg ldxa [%o2] ASI_DMMU, %g2 25827137e52SSam Ravnborg srlx %g2, CTX_PGSZ1_NUC_SHIFT, %o1 25927137e52SSam Ravnborg sllx %o1, CTX_PGSZ1_NUC_SHIFT, %o1 26027137e52SSam Ravnborg or %o0, %o1, %o0 /* Preserve nucleus page size fields */ 26127137e52SSam Ravnborg stxa %o0, [%o2] ASI_DMMU 26227137e52SSam Ravnborg stxa %g0, [%g3] ASI_DMMU_DEMAP 26327137e52SSam Ravnborg stxa %g0, [%g3] ASI_IMMU_DEMAP 26427137e52SSam Ravnborg stxa %g2, [%o2] ASI_DMMU 26527137e52SSam Ravnborg sethi %hi(KERNBASE), %o2 26627137e52SSam Ravnborg flush %o2 26727137e52SSam Ravnborg wrpr %g0, 0, %tl 26827137e52SSam Ravnborg retl 26927137e52SSam Ravnborg wrpr %g7, 0x0, %pstate 27027137e52SSam Ravnborg 271f36391d2SDavid S. Miller__cheetah_flush_tlb_page: /* 22 insns */ 272f36391d2SDavid S. Miller /* %o0 = context, %o1 = vaddr */ 273f36391d2SDavid S. Miller rdpr %pstate, %g7 274f36391d2SDavid S. Miller andn %g7, PSTATE_IE, %g2 275f36391d2SDavid S. Miller wrpr %g2, 0x0, %pstate 276f36391d2SDavid S. Miller wrpr %g0, 1, %tl 277f36391d2SDavid S. Miller mov PRIMARY_CONTEXT, %o4 278f36391d2SDavid S. Miller ldxa [%o4] ASI_DMMU, %g2 279f36391d2SDavid S. Miller srlx %g2, CTX_PGSZ1_NUC_SHIFT, %o3 280f36391d2SDavid S. Miller sllx %o3, CTX_PGSZ1_NUC_SHIFT, %o3 281f36391d2SDavid S. Miller or %o0, %o3, %o0 /* Preserve nucleus page size fields */ 282f36391d2SDavid S. Miller stxa %o0, [%o4] ASI_DMMU 283f36391d2SDavid S. Miller andcc %o1, 1, %g0 284f36391d2SDavid S. Miller be,pn %icc, 1f 285f36391d2SDavid S. Miller andn %o1, 1, %o3 286f36391d2SDavid S. Miller stxa %g0, [%o3] ASI_IMMU_DEMAP 287f36391d2SDavid S. Miller1: stxa %g0, [%o3] ASI_DMMU_DEMAP 288f36391d2SDavid S. Miller membar #Sync 289f36391d2SDavid S. Miller stxa %g2, [%o4] ASI_DMMU 290f36391d2SDavid S. Miller sethi %hi(KERNBASE), %o4 291f36391d2SDavid S. Miller flush %o4 292f36391d2SDavid S. Miller wrpr %g0, 0, %tl 293f36391d2SDavid S. Miller retl 294f36391d2SDavid S. Miller wrpr %g7, 0x0, %pstate 295f36391d2SDavid S. Miller 29627137e52SSam Ravnborg__cheetah_flush_tlb_pending: /* 27 insns */ 29727137e52SSam Ravnborg /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */ 29827137e52SSam Ravnborg rdpr %pstate, %g7 29927137e52SSam Ravnborg sllx %o1, 3, %o1 30027137e52SSam Ravnborg andn %g7, PSTATE_IE, %g2 30127137e52SSam Ravnborg wrpr %g2, 0x0, %pstate 30227137e52SSam Ravnborg wrpr %g0, 1, %tl 30327137e52SSam Ravnborg mov PRIMARY_CONTEXT, %o4 30427137e52SSam Ravnborg ldxa [%o4] ASI_DMMU, %g2 30527137e52SSam Ravnborg srlx %g2, CTX_PGSZ1_NUC_SHIFT, %o3 30627137e52SSam Ravnborg sllx %o3, CTX_PGSZ1_NUC_SHIFT, %o3 30727137e52SSam Ravnborg or %o0, %o3, %o0 /* Preserve nucleus page size fields */ 30827137e52SSam Ravnborg stxa %o0, [%o4] ASI_DMMU 30927137e52SSam Ravnborg1: sub %o1, (1 << 3), %o1 31027137e52SSam Ravnborg ldx [%o2 + %o1], %o3 31127137e52SSam Ravnborg andcc %o3, 1, %g0 31227137e52SSam Ravnborg be,pn %icc, 2f 31327137e52SSam Ravnborg andn %o3, 1, %o3 31427137e52SSam Ravnborg stxa %g0, [%o3] ASI_IMMU_DEMAP 31527137e52SSam Ravnborg2: stxa %g0, [%o3] ASI_DMMU_DEMAP 31627137e52SSam Ravnborg membar #Sync 31727137e52SSam Ravnborg brnz,pt %o1, 1b 31827137e52SSam Ravnborg nop 31927137e52SSam Ravnborg stxa %g2, [%o4] ASI_DMMU 32027137e52SSam Ravnborg sethi %hi(KERNBASE), %o4 32127137e52SSam Ravnborg flush %o4 32227137e52SSam Ravnborg wrpr %g0, 0, %tl 32327137e52SSam Ravnborg retl 32427137e52SSam Ravnborg wrpr %g7, 0x0, %pstate 32527137e52SSam Ravnborg 326a74ad5e6SDavid S. Miller__cheetah_flush_tlb_kernel_range: /* 31 insns */ 327a74ad5e6SDavid S. Miller /* %o0=start, %o1=end */ 328a74ad5e6SDavid S. Miller cmp %o0, %o1 329a74ad5e6SDavid S. Miller be,pn %xcc, 2f 330a74ad5e6SDavid S. Miller sub %o1, %o0, %o3 331a74ad5e6SDavid S. Miller srlx %o3, 18, %o4 332a74ad5e6SDavid S. Miller brnz,pn %o4, 3f 333a74ad5e6SDavid S. Miller sethi %hi(PAGE_SIZE), %o4 334a74ad5e6SDavid S. Miller sub %o3, %o4, %o3 335a74ad5e6SDavid S. Miller or %o0, 0x20, %o0 ! Nucleus 336a74ad5e6SDavid S. Miller1: stxa %g0, [%o0 + %o3] ASI_DMMU_DEMAP 337a74ad5e6SDavid S. Miller stxa %g0, [%o0 + %o3] ASI_IMMU_DEMAP 338a74ad5e6SDavid S. Miller membar #Sync 339a74ad5e6SDavid S. Miller brnz,pt %o3, 1b 340a74ad5e6SDavid S. Miller sub %o3, %o4, %o3 341a74ad5e6SDavid S. Miller2: sethi %hi(KERNBASE), %o3 342a74ad5e6SDavid S. Miller flush %o3 343a74ad5e6SDavid S. Miller retl 344a74ad5e6SDavid S. Miller nop 345a74ad5e6SDavid S. Miller3: mov 0x80, %o4 346a74ad5e6SDavid S. Miller stxa %g0, [%o4] ASI_DMMU_DEMAP 347a74ad5e6SDavid S. Miller membar #Sync 348a74ad5e6SDavid S. Miller stxa %g0, [%o4] ASI_IMMU_DEMAP 349a74ad5e6SDavid S. Miller membar #Sync 350a74ad5e6SDavid S. Miller retl 351a74ad5e6SDavid S. Miller nop 352a74ad5e6SDavid S. Miller nop 353a74ad5e6SDavid S. Miller nop 354a74ad5e6SDavid S. Miller nop 355a74ad5e6SDavid S. Miller nop 356a74ad5e6SDavid S. Miller nop 357a74ad5e6SDavid S. Miller nop 358a74ad5e6SDavid S. Miller nop 359a74ad5e6SDavid S. Miller 36027137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE 36127137e52SSam Ravnborg__cheetah_flush_dcache_page: /* 11 insns */ 362b2d43834SDavid S. Miller sethi %hi(PAGE_OFFSET), %g1 363b2d43834SDavid S. Miller ldx [%g1 + %lo(PAGE_OFFSET)], %g1 36427137e52SSam Ravnborg sub %o0, %g1, %o0 36527137e52SSam Ravnborg sethi %hi(PAGE_SIZE), %o4 36627137e52SSam Ravnborg1: subcc %o4, (1 << 5), %o4 36727137e52SSam Ravnborg stxa %g0, [%o0 + %o4] ASI_DCACHE_INVALIDATE 36827137e52SSam Ravnborg membar #Sync 36927137e52SSam Ravnborg bne,pt %icc, 1b 37027137e52SSam Ravnborg nop 37127137e52SSam Ravnborg retl /* I-cache flush never needed on Cheetah, see callers. */ 37227137e52SSam Ravnborg nop 37327137e52SSam Ravnborg#endif /* DCACHE_ALIASING_POSSIBLE */ 37427137e52SSam Ravnborg 37527137e52SSam Ravnborg /* Hypervisor specific versions, patched at boot time. */ 37627137e52SSam Ravnborg__hypervisor_tlb_tl0_error: 37727137e52SSam Ravnborg save %sp, -192, %sp 37827137e52SSam Ravnborg mov %i0, %o0 37927137e52SSam Ravnborg call hypervisor_tlbop_error 38027137e52SSam Ravnborg mov %i1, %o1 38127137e52SSam Ravnborg ret 38227137e52SSam Ravnborg restore 38327137e52SSam Ravnborg 384b429ae4dSDavid S. Miller__hypervisor_flush_tlb_mm: /* 19 insns */ 38527137e52SSam Ravnborg mov %o0, %o2 /* ARG2: mmu context */ 38627137e52SSam Ravnborg mov 0, %o0 /* ARG0: CPU lists unimplemented */ 38727137e52SSam Ravnborg mov 0, %o1 /* ARG1: CPU lists unimplemented */ 38827137e52SSam Ravnborg mov HV_MMU_ALL, %o3 /* ARG3: flags */ 38927137e52SSam Ravnborg mov HV_FAST_MMU_DEMAP_CTX, %o5 39027137e52SSam Ravnborg ta HV_FAST_TRAP 391b429ae4dSDavid S. Miller brnz,pn %o0, 1f 39227137e52SSam Ravnborg mov HV_FAST_MMU_DEMAP_CTX, %o1 39327137e52SSam Ravnborg retl 39427137e52SSam Ravnborg nop 395b429ae4dSDavid S. Miller1: sethi %hi(__hypervisor_tlb_tl0_error), %o5 396b429ae4dSDavid S. Miller jmpl %o5 + %lo(__hypervisor_tlb_tl0_error), %g0 397b429ae4dSDavid S. Miller nop 398b429ae4dSDavid S. Miller nop 399b429ae4dSDavid S. Miller nop 400b429ae4dSDavid S. Miller nop 401b429ae4dSDavid S. Miller nop 402b429ae4dSDavid S. Miller nop 403b429ae4dSDavid S. Miller nop 40427137e52SSam Ravnborg 405b429ae4dSDavid S. Miller__hypervisor_flush_tlb_page: /* 22 insns */ 406f36391d2SDavid S. Miller /* %o0 = context, %o1 = vaddr */ 407f36391d2SDavid S. Miller mov %o0, %g2 408f36391d2SDavid S. Miller mov %o1, %o0 /* ARG0: vaddr + IMMU-bit */ 409f36391d2SDavid S. Miller mov %g2, %o1 /* ARG1: mmu context */ 410f36391d2SDavid S. Miller mov HV_MMU_ALL, %o2 /* ARG2: flags */ 411f36391d2SDavid S. Miller srlx %o0, PAGE_SHIFT, %o0 412f36391d2SDavid S. Miller sllx %o0, PAGE_SHIFT, %o0 413f36391d2SDavid S. Miller ta HV_MMU_UNMAP_ADDR_TRAP 414b429ae4dSDavid S. Miller brnz,pn %o0, 1f 415f36391d2SDavid S. Miller mov HV_MMU_UNMAP_ADDR_TRAP, %o1 416f36391d2SDavid S. Miller retl 417f36391d2SDavid S. Miller nop 418b429ae4dSDavid S. Miller1: sethi %hi(__hypervisor_tlb_tl0_error), %o2 419b429ae4dSDavid S. Miller jmpl %o2 + %lo(__hypervisor_tlb_tl0_error), %g0 420b429ae4dSDavid S. Miller nop 421b429ae4dSDavid S. Miller nop 422b429ae4dSDavid S. Miller nop 423b429ae4dSDavid S. Miller nop 424b429ae4dSDavid S. Miller nop 425b429ae4dSDavid S. Miller nop 426b429ae4dSDavid S. Miller nop 427b429ae4dSDavid S. Miller nop 428b429ae4dSDavid S. Miller nop 429f36391d2SDavid S. Miller 430830cda3fSDavid S. Miller__hypervisor_flush_tlb_pending: /* 27 insns */ 43127137e52SSam Ravnborg /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */ 43227137e52SSam Ravnborg sllx %o1, 3, %g1 43327137e52SSam Ravnborg mov %o2, %g2 43427137e52SSam Ravnborg mov %o0, %g3 43527137e52SSam Ravnborg1: sub %g1, (1 << 3), %g1 43627137e52SSam Ravnborg ldx [%g2 + %g1], %o0 /* ARG0: vaddr + IMMU-bit */ 43727137e52SSam Ravnborg mov %g3, %o1 /* ARG1: mmu context */ 43827137e52SSam Ravnborg mov HV_MMU_ALL, %o2 /* ARG2: flags */ 43927137e52SSam Ravnborg srlx %o0, PAGE_SHIFT, %o0 44027137e52SSam Ravnborg sllx %o0, PAGE_SHIFT, %o0 44127137e52SSam Ravnborg ta HV_MMU_UNMAP_ADDR_TRAP 442b429ae4dSDavid S. Miller brnz,pn %o0, 1f 44327137e52SSam Ravnborg mov HV_MMU_UNMAP_ADDR_TRAP, %o1 44427137e52SSam Ravnborg brnz,pt %g1, 1b 44527137e52SSam Ravnborg nop 44627137e52SSam Ravnborg retl 44727137e52SSam Ravnborg nop 448b429ae4dSDavid S. Miller1: sethi %hi(__hypervisor_tlb_tl0_error), %o2 449b429ae4dSDavid S. Miller jmpl %o2 + %lo(__hypervisor_tlb_tl0_error), %g0 450b429ae4dSDavid S. Miller nop 451b429ae4dSDavid S. Miller nop 452b429ae4dSDavid S. Miller nop 453b429ae4dSDavid S. Miller nop 454b429ae4dSDavid S. Miller nop 455b429ae4dSDavid S. Miller nop 456b429ae4dSDavid S. Miller nop 457b429ae4dSDavid S. Miller nop 458b429ae4dSDavid S. Miller nop 45927137e52SSam Ravnborg 460a74ad5e6SDavid S. Miller__hypervisor_flush_tlb_kernel_range: /* 31 insns */ 46127137e52SSam Ravnborg /* %o0=start, %o1=end */ 46227137e52SSam Ravnborg cmp %o0, %o1 46327137e52SSam Ravnborg be,pn %xcc, 2f 464a74ad5e6SDavid S. Miller sub %o1, %o0, %g2 465a74ad5e6SDavid S. Miller srlx %g2, 18, %g3 466a74ad5e6SDavid S. Miller brnz,pn %g3, 4f 46727137e52SSam Ravnborg mov %o0, %g1 468a74ad5e6SDavid S. Miller sethi %hi(PAGE_SIZE), %g3 46927137e52SSam Ravnborg sub %g2, %g3, %g2 47027137e52SSam Ravnborg1: add %g1, %g2, %o0 /* ARG0: virtual address */ 47127137e52SSam Ravnborg mov 0, %o1 /* ARG1: mmu context */ 47227137e52SSam Ravnborg mov HV_MMU_ALL, %o2 /* ARG2: flags */ 47327137e52SSam Ravnborg ta HV_MMU_UNMAP_ADDR_TRAP 474b429ae4dSDavid S. Miller brnz,pn %o0, 3f 47527137e52SSam Ravnborg mov HV_MMU_UNMAP_ADDR_TRAP, %o1 47627137e52SSam Ravnborg brnz,pt %g2, 1b 47727137e52SSam Ravnborg sub %g2, %g3, %g2 47827137e52SSam Ravnborg2: retl 47927137e52SSam Ravnborg nop 480b429ae4dSDavid S. Miller3: sethi %hi(__hypervisor_tlb_tl0_error), %o2 481b429ae4dSDavid S. Miller jmpl %o2 + %lo(__hypervisor_tlb_tl0_error), %g0 482b429ae4dSDavid S. Miller nop 483a74ad5e6SDavid S. Miller4: mov 0, %o0 /* ARG0: CPU lists unimplemented */ 484a74ad5e6SDavid S. Miller mov 0, %o1 /* ARG1: CPU lists unimplemented */ 485a74ad5e6SDavid S. Miller mov 0, %o2 /* ARG2: mmu context == nucleus */ 486a74ad5e6SDavid S. Miller mov HV_MMU_ALL, %o3 /* ARG3: flags */ 487a74ad5e6SDavid S. Miller mov HV_FAST_MMU_DEMAP_CTX, %o5 488a74ad5e6SDavid S. Miller ta HV_FAST_TRAP 489a74ad5e6SDavid S. Miller brnz,pn %o0, 3b 490a74ad5e6SDavid S. Miller mov HV_FAST_MMU_DEMAP_CTX, %o1 491a74ad5e6SDavid S. Miller retl 492a74ad5e6SDavid S. Miller nop 49327137e52SSam Ravnborg 49427137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE 49527137e52SSam Ravnborg /* XXX Niagara and friends have an 8K cache, so no aliasing is 49627137e52SSam Ravnborg * XXX possible, but nothing explicit in the Hypervisor API 49727137e52SSam Ravnborg * XXX guarantees this. 49827137e52SSam Ravnborg */ 49927137e52SSam Ravnborg__hypervisor_flush_dcache_page: /* 2 insns */ 50027137e52SSam Ravnborg retl 50127137e52SSam Ravnborg nop 50227137e52SSam Ravnborg#endif 50327137e52SSam Ravnborg 50427137e52SSam Ravnborgtlb_patch_one: 50527137e52SSam Ravnborg1: lduw [%o1], %g1 50627137e52SSam Ravnborg stw %g1, [%o0] 50727137e52SSam Ravnborg flush %o0 50827137e52SSam Ravnborg subcc %o2, 1, %o2 50927137e52SSam Ravnborg add %o1, 4, %o1 51027137e52SSam Ravnborg bne,pt %icc, 1b 51127137e52SSam Ravnborg add %o0, 4, %o0 51227137e52SSam Ravnborg retl 51327137e52SSam Ravnborg nop 51427137e52SSam Ravnborg 51527137e52SSam Ravnborg#ifdef CONFIG_SMP 51627137e52SSam Ravnborg /* These are all called by the slaves of a cross call, at 51727137e52SSam Ravnborg * trap level 1, with interrupts fully disabled. 51827137e52SSam Ravnborg * 51927137e52SSam Ravnborg * Register usage: 52027137e52SSam Ravnborg * %g5 mm->context (all tlb flushes) 52127137e52SSam Ravnborg * %g1 address arg 1 (tlb page and range flushes) 52227137e52SSam Ravnborg * %g7 address arg 2 (tlb range flush only) 52327137e52SSam Ravnborg * 52427137e52SSam Ravnborg * %g6 scratch 1 52527137e52SSam Ravnborg * %g2 scratch 2 52627137e52SSam Ravnborg * %g3 scratch 3 52727137e52SSam Ravnborg * %g4 scratch 4 52827137e52SSam Ravnborg */ 52927137e52SSam Ravnborg .align 32 53027137e52SSam Ravnborg .globl xcall_flush_tlb_mm 531a236441bSDavid S. Millerxcall_flush_tlb_mm: /* 24 insns */ 53227137e52SSam Ravnborg mov PRIMARY_CONTEXT, %g2 53327137e52SSam Ravnborg ldxa [%g2] ASI_DMMU, %g3 53427137e52SSam Ravnborg srlx %g3, CTX_PGSZ1_NUC_SHIFT, %g4 53527137e52SSam Ravnborg sllx %g4, CTX_PGSZ1_NUC_SHIFT, %g4 53627137e52SSam Ravnborg or %g5, %g4, %g5 /* Preserve nucleus page size fields */ 53727137e52SSam Ravnborg stxa %g5, [%g2] ASI_DMMU 53827137e52SSam Ravnborg mov 0x40, %g4 53927137e52SSam Ravnborg stxa %g0, [%g4] ASI_DMMU_DEMAP 54027137e52SSam Ravnborg stxa %g0, [%g4] ASI_IMMU_DEMAP 54127137e52SSam Ravnborg stxa %g3, [%g2] ASI_DMMU 54227137e52SSam Ravnborg retry 54327137e52SSam Ravnborg nop 54427137e52SSam Ravnborg nop 54527137e52SSam Ravnborg nop 54627137e52SSam Ravnborg nop 54727137e52SSam Ravnborg nop 54827137e52SSam Ravnborg nop 54927137e52SSam Ravnborg nop 55027137e52SSam Ravnborg nop 55127137e52SSam Ravnborg nop 55227137e52SSam Ravnborg nop 553a236441bSDavid S. Miller nop 554a236441bSDavid S. Miller nop 555a236441bSDavid S. Miller nop 55627137e52SSam Ravnborg 557f36391d2SDavid S. Miller .globl xcall_flush_tlb_page 558a236441bSDavid S. Millerxcall_flush_tlb_page: /* 20 insns */ 559f36391d2SDavid S. Miller /* %g5=context, %g1=vaddr */ 56027137e52SSam Ravnborg mov PRIMARY_CONTEXT, %g4 56127137e52SSam Ravnborg ldxa [%g4] ASI_DMMU, %g2 56227137e52SSam Ravnborg srlx %g2, CTX_PGSZ1_NUC_SHIFT, %g4 56327137e52SSam Ravnborg sllx %g4, CTX_PGSZ1_NUC_SHIFT, %g4 56427137e52SSam Ravnborg or %g5, %g4, %g5 56527137e52SSam Ravnborg mov PRIMARY_CONTEXT, %g4 56627137e52SSam Ravnborg stxa %g5, [%g4] ASI_DMMU 567f36391d2SDavid S. Miller andcc %g1, 0x1, %g0 56827137e52SSam Ravnborg be,pn %icc, 2f 569f36391d2SDavid S. Miller andn %g1, 0x1, %g5 57027137e52SSam Ravnborg stxa %g0, [%g5] ASI_IMMU_DEMAP 57127137e52SSam Ravnborg2: stxa %g0, [%g5] ASI_DMMU_DEMAP 57227137e52SSam Ravnborg membar #Sync 57327137e52SSam Ravnborg stxa %g2, [%g4] ASI_DMMU 57427137e52SSam Ravnborg retry 57527137e52SSam Ravnborg nop 576f36391d2SDavid S. Miller nop 577a236441bSDavid S. Miller nop 578a236441bSDavid S. Miller nop 579a236441bSDavid S. Miller nop 58027137e52SSam Ravnborg 58127137e52SSam Ravnborg .globl xcall_flush_tlb_kernel_range 582a74ad5e6SDavid S. Millerxcall_flush_tlb_kernel_range: /* 44 insns */ 58327137e52SSam Ravnborg sethi %hi(PAGE_SIZE - 1), %g2 58427137e52SSam Ravnborg or %g2, %lo(PAGE_SIZE - 1), %g2 58527137e52SSam Ravnborg andn %g1, %g2, %g1 58627137e52SSam Ravnborg andn %g7, %g2, %g7 58727137e52SSam Ravnborg sub %g7, %g1, %g3 588a74ad5e6SDavid S. Miller srlx %g3, 18, %g2 589a74ad5e6SDavid S. Miller brnz,pn %g2, 2f 590d3c976c1SJames Clarke sethi %hi(PAGE_SIZE), %g2 59127137e52SSam Ravnborg sub %g3, %g2, %g3 59227137e52SSam Ravnborg or %g1, 0x20, %g1 ! Nucleus 59327137e52SSam Ravnborg1: stxa %g0, [%g1 + %g3] ASI_DMMU_DEMAP 59427137e52SSam Ravnborg stxa %g0, [%g1 + %g3] ASI_IMMU_DEMAP 59527137e52SSam Ravnborg membar #Sync 59627137e52SSam Ravnborg brnz,pt %g3, 1b 59727137e52SSam Ravnborg sub %g3, %g2, %g3 59827137e52SSam Ravnborg retry 599a74ad5e6SDavid S. Miller2: mov 63 * 8, %g1 600a74ad5e6SDavid S. Miller1: ldxa [%g1] ASI_ITLB_DATA_ACCESS, %g2 601a74ad5e6SDavid S. Miller andcc %g2, 0x40, %g0 /* _PAGE_L_4U */ 602a74ad5e6SDavid S. Miller bne,pn %xcc, 2f 603a74ad5e6SDavid S. Miller mov TLB_TAG_ACCESS, %g2 604a74ad5e6SDavid S. Miller stxa %g0, [%g2] ASI_IMMU 605a74ad5e6SDavid S. Miller stxa %g0, [%g1] ASI_ITLB_DATA_ACCESS 606a74ad5e6SDavid S. Miller membar #Sync 607a74ad5e6SDavid S. Miller2: ldxa [%g1] ASI_DTLB_DATA_ACCESS, %g2 608a74ad5e6SDavid S. Miller andcc %g2, 0x40, %g0 609a74ad5e6SDavid S. Miller bne,pn %xcc, 2f 610a74ad5e6SDavid S. Miller mov TLB_TAG_ACCESS, %g2 611a74ad5e6SDavid S. Miller stxa %g0, [%g2] ASI_DMMU 612a74ad5e6SDavid S. Miller stxa %g0, [%g1] ASI_DTLB_DATA_ACCESS 613a74ad5e6SDavid S. Miller membar #Sync 614a74ad5e6SDavid S. Miller2: sub %g1, 8, %g1 615a74ad5e6SDavid S. Miller brgez,pt %g1, 1b 61627137e52SSam Ravnborg nop 617a74ad5e6SDavid S. Miller retry 61827137e52SSam Ravnborg nop 61927137e52SSam Ravnborg nop 62027137e52SSam Ravnborg nop 62127137e52SSam Ravnborg nop 62227137e52SSam Ravnborg nop 62327137e52SSam Ravnborg nop 624a236441bSDavid S. Miller nop 625a236441bSDavid S. Miller nop 626a236441bSDavid S. Miller nop 62727137e52SSam Ravnborg 62827137e52SSam Ravnborg /* This runs in a very controlled environment, so we do 62927137e52SSam Ravnborg * not need to worry about BH races etc. 63027137e52SSam Ravnborg */ 63127137e52SSam Ravnborg .globl xcall_sync_tick 63227137e52SSam Ravnborgxcall_sync_tick: 63327137e52SSam Ravnborg 63427137e52SSam Ravnborg661: rdpr %pstate, %g2 63527137e52SSam Ravnborg wrpr %g2, PSTATE_IG | PSTATE_AG, %pstate 63627137e52SSam Ravnborg .section .sun4v_2insn_patch, "ax" 63727137e52SSam Ravnborg .word 661b 63827137e52SSam Ravnborg nop 63927137e52SSam Ravnborg nop 64027137e52SSam Ravnborg .previous 64127137e52SSam Ravnborg 64227137e52SSam Ravnborg rdpr %pil, %g2 643b4f4372fSDavid S. Miller wrpr %g0, PIL_NORMAL_MAX, %pil 64427137e52SSam Ravnborg sethi %hi(109f), %g7 64527137e52SSam Ravnborg b,pt %xcc, etrap_irq 64627137e52SSam Ravnborg109: or %g7, %lo(109b), %g7 64727137e52SSam Ravnborg#ifdef CONFIG_TRACE_IRQFLAGS 64827137e52SSam Ravnborg call trace_hardirqs_off 64927137e52SSam Ravnborg nop 65027137e52SSam Ravnborg#endif 65127137e52SSam Ravnborg call smp_synchronize_tick_client 65227137e52SSam Ravnborg nop 65327137e52SSam Ravnborg b rtrap_xcall 65427137e52SSam Ravnborg ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 65527137e52SSam Ravnborg 65627137e52SSam Ravnborg .globl xcall_fetch_glob_regs 65727137e52SSam Ravnborgxcall_fetch_glob_regs: 658916ca14aSDavid S. Miller sethi %hi(global_cpu_snapshot), %g1 659916ca14aSDavid S. Miller or %g1, %lo(global_cpu_snapshot), %g1 66027137e52SSam Ravnborg __GET_CPUID(%g2) 66127137e52SSam Ravnborg sllx %g2, 6, %g3 66227137e52SSam Ravnborg add %g1, %g3, %g1 66327137e52SSam Ravnborg rdpr %tstate, %g7 66427137e52SSam Ravnborg stx %g7, [%g1 + GR_SNAP_TSTATE] 66527137e52SSam Ravnborg rdpr %tpc, %g7 66627137e52SSam Ravnborg stx %g7, [%g1 + GR_SNAP_TPC] 66727137e52SSam Ravnborg rdpr %tnpc, %g7 66827137e52SSam Ravnborg stx %g7, [%g1 + GR_SNAP_TNPC] 66927137e52SSam Ravnborg stx %o7, [%g1 + GR_SNAP_O7] 67027137e52SSam Ravnborg stx %i7, [%g1 + GR_SNAP_I7] 67127137e52SSam Ravnborg /* Don't try this at home kids... */ 672a5a737e0SDavid S. Miller rdpr %cwp, %g3 673a5a737e0SDavid S. Miller sub %g3, 1, %g7 67427137e52SSam Ravnborg wrpr %g7, %cwp 67527137e52SSam Ravnborg mov %i7, %g7 676a5a737e0SDavid S. Miller wrpr %g3, %cwp 67727137e52SSam Ravnborg stx %g7, [%g1 + GR_SNAP_RPC] 67827137e52SSam Ravnborg sethi %hi(trap_block), %g7 67927137e52SSam Ravnborg or %g7, %lo(trap_block), %g7 68027137e52SSam Ravnborg sllx %g2, TRAP_BLOCK_SZ_SHIFT, %g2 68127137e52SSam Ravnborg add %g7, %g2, %g7 68227137e52SSam Ravnborg ldx [%g7 + TRAP_PER_CPU_THREAD], %g3 68327137e52SSam Ravnborg stx %g3, [%g1 + GR_SNAP_THREAD] 68427137e52SSam Ravnborg retry 68527137e52SSam Ravnborg 686916ca14aSDavid S. Miller .globl xcall_fetch_glob_pmu 687916ca14aSDavid S. Millerxcall_fetch_glob_pmu: 688916ca14aSDavid S. Miller sethi %hi(global_cpu_snapshot), %g1 689916ca14aSDavid S. Miller or %g1, %lo(global_cpu_snapshot), %g1 690916ca14aSDavid S. Miller __GET_CPUID(%g2) 691916ca14aSDavid S. Miller sllx %g2, 6, %g3 692916ca14aSDavid S. Miller add %g1, %g3, %g1 693916ca14aSDavid S. Miller rd %pic, %g7 694916ca14aSDavid S. Miller stx %g7, [%g1 + (4 * 8)] 695916ca14aSDavid S. Miller rd %pcr, %g7 696916ca14aSDavid S. Miller stx %g7, [%g1 + (0 * 8)] 697916ca14aSDavid S. Miller retry 698916ca14aSDavid S. Miller 699916ca14aSDavid S. Miller .globl xcall_fetch_glob_pmu_n4 700916ca14aSDavid S. Millerxcall_fetch_glob_pmu_n4: 701916ca14aSDavid S. Miller sethi %hi(global_cpu_snapshot), %g1 702916ca14aSDavid S. Miller or %g1, %lo(global_cpu_snapshot), %g1 703916ca14aSDavid S. Miller __GET_CPUID(%g2) 704916ca14aSDavid S. Miller sllx %g2, 6, %g3 705916ca14aSDavid S. Miller add %g1, %g3, %g1 706916ca14aSDavid S. Miller 707916ca14aSDavid S. Miller ldxa [%g0] ASI_PIC, %g7 708916ca14aSDavid S. Miller stx %g7, [%g1 + (4 * 8)] 709916ca14aSDavid S. Miller mov 0x08, %g3 710916ca14aSDavid S. Miller ldxa [%g3] ASI_PIC, %g7 711916ca14aSDavid S. Miller stx %g7, [%g1 + (5 * 8)] 712916ca14aSDavid S. Miller mov 0x10, %g3 713916ca14aSDavid S. Miller ldxa [%g3] ASI_PIC, %g7 714916ca14aSDavid S. Miller stx %g7, [%g1 + (6 * 8)] 715916ca14aSDavid S. Miller mov 0x18, %g3 716916ca14aSDavid S. Miller ldxa [%g3] ASI_PIC, %g7 717916ca14aSDavid S. Miller stx %g7, [%g1 + (7 * 8)] 718916ca14aSDavid S. Miller 719916ca14aSDavid S. Miller mov %o0, %g2 720916ca14aSDavid S. Miller mov %o1, %g3 721916ca14aSDavid S. Miller mov %o5, %g7 722916ca14aSDavid S. Miller 723916ca14aSDavid S. Miller mov HV_FAST_VT_GET_PERFREG, %o5 724916ca14aSDavid S. Miller mov 3, %o0 725916ca14aSDavid S. Miller ta HV_FAST_TRAP 726916ca14aSDavid S. Miller stx %o1, [%g1 + (3 * 8)] 727916ca14aSDavid S. Miller mov HV_FAST_VT_GET_PERFREG, %o5 728916ca14aSDavid S. Miller mov 2, %o0 729916ca14aSDavid S. Miller ta HV_FAST_TRAP 730916ca14aSDavid S. Miller stx %o1, [%g1 + (2 * 8)] 731916ca14aSDavid S. Miller mov HV_FAST_VT_GET_PERFREG, %o5 732916ca14aSDavid S. Miller mov 1, %o0 733916ca14aSDavid S. Miller ta HV_FAST_TRAP 734916ca14aSDavid S. Miller stx %o1, [%g1 + (1 * 8)] 735916ca14aSDavid S. Miller mov HV_FAST_VT_GET_PERFREG, %o5 736916ca14aSDavid S. Miller mov 0, %o0 737916ca14aSDavid S. Miller ta HV_FAST_TRAP 738916ca14aSDavid S. Miller stx %o1, [%g1 + (0 * 8)] 739916ca14aSDavid S. Miller 740916ca14aSDavid S. Miller mov %g2, %o0 741916ca14aSDavid S. Miller mov %g3, %o1 742916ca14aSDavid S. Miller mov %g7, %o5 743916ca14aSDavid S. Miller 744916ca14aSDavid S. Miller retry 745916ca14aSDavid S. Miller 746a74ad5e6SDavid S. Miller__cheetah_xcall_flush_tlb_kernel_range: /* 44 insns */ 747a74ad5e6SDavid S. Miller sethi %hi(PAGE_SIZE - 1), %g2 748a74ad5e6SDavid S. Miller or %g2, %lo(PAGE_SIZE - 1), %g2 749a74ad5e6SDavid S. Miller andn %g1, %g2, %g1 750a74ad5e6SDavid S. Miller andn %g7, %g2, %g7 751a74ad5e6SDavid S. Miller sub %g7, %g1, %g3 752a74ad5e6SDavid S. Miller srlx %g3, 18, %g2 753a74ad5e6SDavid S. Miller brnz,pn %g2, 2f 754d3c976c1SJames Clarke sethi %hi(PAGE_SIZE), %g2 755a74ad5e6SDavid S. Miller sub %g3, %g2, %g3 756a74ad5e6SDavid S. Miller or %g1, 0x20, %g1 ! Nucleus 757a74ad5e6SDavid S. Miller1: stxa %g0, [%g1 + %g3] ASI_DMMU_DEMAP 758a74ad5e6SDavid S. Miller stxa %g0, [%g1 + %g3] ASI_IMMU_DEMAP 759a74ad5e6SDavid S. Miller membar #Sync 760a74ad5e6SDavid S. Miller brnz,pt %g3, 1b 761a74ad5e6SDavid S. Miller sub %g3, %g2, %g3 762a74ad5e6SDavid S. Miller retry 763a74ad5e6SDavid S. Miller2: mov 0x80, %g2 764a74ad5e6SDavid S. Miller stxa %g0, [%g2] ASI_DMMU_DEMAP 765a74ad5e6SDavid S. Miller membar #Sync 766a74ad5e6SDavid S. Miller stxa %g0, [%g2] ASI_IMMU_DEMAP 767a74ad5e6SDavid S. Miller membar #Sync 768a74ad5e6SDavid S. Miller retry 769a74ad5e6SDavid S. Miller nop 770a74ad5e6SDavid S. Miller nop 771a74ad5e6SDavid S. Miller nop 772a74ad5e6SDavid S. Miller nop 773a74ad5e6SDavid S. Miller nop 774a74ad5e6SDavid S. Miller nop 775a74ad5e6SDavid S. Miller nop 776a74ad5e6SDavid S. Miller nop 777a74ad5e6SDavid S. Miller nop 778a74ad5e6SDavid S. Miller nop 779a74ad5e6SDavid S. Miller nop 780a74ad5e6SDavid S. Miller nop 781a74ad5e6SDavid S. Miller nop 782a74ad5e6SDavid S. Miller nop 783a74ad5e6SDavid S. Miller nop 784a74ad5e6SDavid S. Miller nop 785a74ad5e6SDavid S. Miller nop 786a74ad5e6SDavid S. Miller nop 787a74ad5e6SDavid S. Miller nop 788a74ad5e6SDavid S. Miller nop 789a74ad5e6SDavid S. Miller nop 790a74ad5e6SDavid S. Miller nop 791a74ad5e6SDavid S. Miller 79227137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE 79327137e52SSam Ravnborg .align 32 79427137e52SSam Ravnborg .globl xcall_flush_dcache_page_cheetah 79527137e52SSam Ravnborgxcall_flush_dcache_page_cheetah: /* %g1 == physical page address */ 79627137e52SSam Ravnborg sethi %hi(PAGE_SIZE), %g3 79727137e52SSam Ravnborg1: subcc %g3, (1 << 5), %g3 79827137e52SSam Ravnborg stxa %g0, [%g1 + %g3] ASI_DCACHE_INVALIDATE 79927137e52SSam Ravnborg membar #Sync 80027137e52SSam Ravnborg bne,pt %icc, 1b 80127137e52SSam Ravnborg nop 80227137e52SSam Ravnborg retry 80327137e52SSam Ravnborg nop 80427137e52SSam Ravnborg#endif /* DCACHE_ALIASING_POSSIBLE */ 80527137e52SSam Ravnborg 80627137e52SSam Ravnborg .globl xcall_flush_dcache_page_spitfire 80727137e52SSam Ravnborgxcall_flush_dcache_page_spitfire: /* %g1 == physical page address 80827137e52SSam Ravnborg %g7 == kernel page virtual address 80927137e52SSam Ravnborg %g5 == (page->mapping != NULL) */ 81027137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE 81127137e52SSam Ravnborg srlx %g1, (13 - 2), %g1 ! Form tag comparitor 81227137e52SSam Ravnborg sethi %hi(L1DCACHE_SIZE), %g3 ! D$ size == 16K 81327137e52SSam Ravnborg sub %g3, (1 << 5), %g3 ! D$ linesize == 32 81427137e52SSam Ravnborg1: ldxa [%g3] ASI_DCACHE_TAG, %g2 81527137e52SSam Ravnborg andcc %g2, 0x3, %g0 81627137e52SSam Ravnborg be,pn %xcc, 2f 81727137e52SSam Ravnborg andn %g2, 0x3, %g2 81827137e52SSam Ravnborg cmp %g2, %g1 81927137e52SSam Ravnborg 82027137e52SSam Ravnborg bne,pt %xcc, 2f 82127137e52SSam Ravnborg nop 82227137e52SSam Ravnborg stxa %g0, [%g3] ASI_DCACHE_TAG 82327137e52SSam Ravnborg membar #Sync 82427137e52SSam Ravnborg2: cmp %g3, 0 82527137e52SSam Ravnborg bne,pt %xcc, 1b 82627137e52SSam Ravnborg sub %g3, (1 << 5), %g3 82727137e52SSam Ravnborg 82827137e52SSam Ravnborg brz,pn %g5, 2f 82927137e52SSam Ravnborg#endif /* DCACHE_ALIASING_POSSIBLE */ 83027137e52SSam Ravnborg sethi %hi(PAGE_SIZE), %g3 83127137e52SSam Ravnborg 83227137e52SSam Ravnborg1: flush %g7 83327137e52SSam Ravnborg subcc %g3, (1 << 5), %g3 83427137e52SSam Ravnborg bne,pt %icc, 1b 83527137e52SSam Ravnborg add %g7, (1 << 5), %g7 83627137e52SSam Ravnborg 83727137e52SSam Ravnborg2: retry 83827137e52SSam Ravnborg nop 83927137e52SSam Ravnborg nop 84027137e52SSam Ravnborg 84127137e52SSam Ravnborg /* %g5: error 84227137e52SSam Ravnborg * %g6: tlb op 84327137e52SSam Ravnborg */ 84427137e52SSam Ravnborg__hypervisor_tlb_xcall_error: 84527137e52SSam Ravnborg mov %g5, %g4 84627137e52SSam Ravnborg mov %g6, %g5 84727137e52SSam Ravnborg ba,pt %xcc, etrap 84827137e52SSam Ravnborg rd %pc, %g7 84927137e52SSam Ravnborg mov %l4, %o0 85027137e52SSam Ravnborg call hypervisor_tlbop_error_xcall 85127137e52SSam Ravnborg mov %l5, %o1 85227137e52SSam Ravnborg ba,a,pt %xcc, rtrap 85327137e52SSam Ravnborg 85427137e52SSam Ravnborg .globl __hypervisor_xcall_flush_tlb_mm 855a236441bSDavid S. Miller__hypervisor_xcall_flush_tlb_mm: /* 24 insns */ 85627137e52SSam Ravnborg /* %g5=ctx, g1,g2,g3,g4,g7=scratch, %g6=unusable */ 85727137e52SSam Ravnborg mov %o0, %g2 85827137e52SSam Ravnborg mov %o1, %g3 85927137e52SSam Ravnborg mov %o2, %g4 86027137e52SSam Ravnborg mov %o3, %g1 86127137e52SSam Ravnborg mov %o5, %g7 86227137e52SSam Ravnborg clr %o0 /* ARG0: CPU lists unimplemented */ 86327137e52SSam Ravnborg clr %o1 /* ARG1: CPU lists unimplemented */ 86427137e52SSam Ravnborg mov %g5, %o2 /* ARG2: mmu context */ 86527137e52SSam Ravnborg mov HV_MMU_ALL, %o3 /* ARG3: flags */ 86627137e52SSam Ravnborg mov HV_FAST_MMU_DEMAP_CTX, %o5 86727137e52SSam Ravnborg ta HV_FAST_TRAP 86827137e52SSam Ravnborg mov HV_FAST_MMU_DEMAP_CTX, %g6 869a236441bSDavid S. Miller brnz,pn %o0, 1f 87027137e52SSam Ravnborg mov %o0, %g5 87127137e52SSam Ravnborg mov %g2, %o0 87227137e52SSam Ravnborg mov %g3, %o1 87327137e52SSam Ravnborg mov %g4, %o2 87427137e52SSam Ravnborg mov %g1, %o3 87527137e52SSam Ravnborg mov %g7, %o5 87627137e52SSam Ravnborg membar #Sync 87727137e52SSam Ravnborg retry 878a236441bSDavid S. Miller1: sethi %hi(__hypervisor_tlb_xcall_error), %g4 879a236441bSDavid S. Miller jmpl %g4 + %lo(__hypervisor_tlb_xcall_error), %g0 880a236441bSDavid S. Miller nop 88127137e52SSam Ravnborg 882f36391d2SDavid S. Miller .globl __hypervisor_xcall_flush_tlb_page 883a236441bSDavid S. Miller__hypervisor_xcall_flush_tlb_page: /* 20 insns */ 884f36391d2SDavid S. Miller /* %g5=ctx, %g1=vaddr */ 88527137e52SSam Ravnborg mov %o0, %g2 88627137e52SSam Ravnborg mov %o1, %g3 88727137e52SSam Ravnborg mov %o2, %g4 888f36391d2SDavid S. Miller mov %g1, %o0 /* ARG0: virtual address */ 88927137e52SSam Ravnborg mov %g5, %o1 /* ARG1: mmu context */ 89027137e52SSam Ravnborg mov HV_MMU_ALL, %o2 /* ARG2: flags */ 89127137e52SSam Ravnborg srlx %o0, PAGE_SHIFT, %o0 89227137e52SSam Ravnborg sllx %o0, PAGE_SHIFT, %o0 89327137e52SSam Ravnborg ta HV_MMU_UNMAP_ADDR_TRAP 89427137e52SSam Ravnborg mov HV_MMU_UNMAP_ADDR_TRAP, %g6 895a236441bSDavid S. Miller brnz,a,pn %o0, 1f 89627137e52SSam Ravnborg mov %o0, %g5 89727137e52SSam Ravnborg mov %g2, %o0 89827137e52SSam Ravnborg mov %g3, %o1 89927137e52SSam Ravnborg mov %g4, %o2 90027137e52SSam Ravnborg membar #Sync 90127137e52SSam Ravnborg retry 902a236441bSDavid S. Miller1: sethi %hi(__hypervisor_tlb_xcall_error), %g4 903a236441bSDavid S. Miller jmpl %g4 + %lo(__hypervisor_tlb_xcall_error), %g0 904a236441bSDavid S. Miller nop 90527137e52SSam Ravnborg 90627137e52SSam Ravnborg .globl __hypervisor_xcall_flush_tlb_kernel_range 907a74ad5e6SDavid S. Miller__hypervisor_xcall_flush_tlb_kernel_range: /* 44 insns */ 90827137e52SSam Ravnborg /* %g1=start, %g7=end, g2,g3,g4,g5,g6=scratch */ 90927137e52SSam Ravnborg sethi %hi(PAGE_SIZE - 1), %g2 91027137e52SSam Ravnborg or %g2, %lo(PAGE_SIZE - 1), %g2 91127137e52SSam Ravnborg andn %g1, %g2, %g1 91227137e52SSam Ravnborg andn %g7, %g2, %g7 91327137e52SSam Ravnborg sub %g7, %g1, %g3 914a74ad5e6SDavid S. Miller srlx %g3, 18, %g7 91527137e52SSam Ravnborg add %g2, 1, %g2 91627137e52SSam Ravnborg sub %g3, %g2, %g3 91727137e52SSam Ravnborg mov %o0, %g2 91827137e52SSam Ravnborg mov %o1, %g4 919a74ad5e6SDavid S. Miller brnz,pn %g7, 2f 92027137e52SSam Ravnborg mov %o2, %g7 92127137e52SSam Ravnborg1: add %g1, %g3, %o0 /* ARG0: virtual address */ 92227137e52SSam Ravnborg mov 0, %o1 /* ARG1: mmu context */ 92327137e52SSam Ravnborg mov HV_MMU_ALL, %o2 /* ARG2: flags */ 92427137e52SSam Ravnborg ta HV_MMU_UNMAP_ADDR_TRAP 92527137e52SSam Ravnborg mov HV_MMU_UNMAP_ADDR_TRAP, %g6 926a236441bSDavid S. Miller brnz,pn %o0, 1f 92727137e52SSam Ravnborg mov %o0, %g5 92827137e52SSam Ravnborg sethi %hi(PAGE_SIZE), %o2 92927137e52SSam Ravnborg brnz,pt %g3, 1b 93027137e52SSam Ravnborg sub %g3, %o2, %g3 931a74ad5e6SDavid S. Miller5: mov %g2, %o0 93227137e52SSam Ravnborg mov %g4, %o1 93327137e52SSam Ravnborg mov %g7, %o2 93427137e52SSam Ravnborg membar #Sync 93527137e52SSam Ravnborg retry 936a236441bSDavid S. Miller1: sethi %hi(__hypervisor_tlb_xcall_error), %g4 937a236441bSDavid S. Miller jmpl %g4 + %lo(__hypervisor_tlb_xcall_error), %g0 938a236441bSDavid S. Miller nop 939a74ad5e6SDavid S. Miller2: mov %o3, %g1 940a74ad5e6SDavid S. Miller mov %o5, %g3 941a74ad5e6SDavid S. Miller mov 0, %o0 /* ARG0: CPU lists unimplemented */ 942a74ad5e6SDavid S. Miller mov 0, %o1 /* ARG1: CPU lists unimplemented */ 943a74ad5e6SDavid S. Miller mov 0, %o2 /* ARG2: mmu context == nucleus */ 944a74ad5e6SDavid S. Miller mov HV_MMU_ALL, %o3 /* ARG3: flags */ 945a74ad5e6SDavid S. Miller mov HV_FAST_MMU_DEMAP_CTX, %o5 946a74ad5e6SDavid S. Miller ta HV_FAST_TRAP 947a74ad5e6SDavid S. Miller mov %g1, %o3 948a74ad5e6SDavid S. Miller brz,pt %o0, 5b 949a74ad5e6SDavid S. Miller mov %g3, %o5 950a74ad5e6SDavid S. Miller mov HV_FAST_MMU_DEMAP_CTX, %g6 951a74ad5e6SDavid S. Miller ba,pt %xcc, 1b 952a74ad5e6SDavid S. Miller clr %g5 95327137e52SSam Ravnborg 95427137e52SSam Ravnborg /* These just get rescheduled to PIL vectors. */ 95527137e52SSam Ravnborg .globl xcall_call_function 95627137e52SSam Ravnborgxcall_call_function: 95727137e52SSam Ravnborg wr %g0, (1 << PIL_SMP_CALL_FUNC), %set_softint 95827137e52SSam Ravnborg retry 95927137e52SSam Ravnborg 96027137e52SSam Ravnborg .globl xcall_call_function_single 96127137e52SSam Ravnborgxcall_call_function_single: 96227137e52SSam Ravnborg wr %g0, (1 << PIL_SMP_CALL_FUNC_SNGL), %set_softint 96327137e52SSam Ravnborg retry 96427137e52SSam Ravnborg 96527137e52SSam Ravnborg .globl xcall_receive_signal 96627137e52SSam Ravnborgxcall_receive_signal: 96727137e52SSam Ravnborg wr %g0, (1 << PIL_SMP_RECEIVE_SIGNAL), %set_softint 96827137e52SSam Ravnborg retry 96927137e52SSam Ravnborg 97027137e52SSam Ravnborg .globl xcall_capture 97127137e52SSam Ravnborgxcall_capture: 97227137e52SSam Ravnborg wr %g0, (1 << PIL_SMP_CAPTURE), %set_softint 97327137e52SSam Ravnborg retry 97427137e52SSam Ravnborg 97527137e52SSam Ravnborg#ifdef CONFIG_KGDB 97627137e52SSam Ravnborg .globl xcall_kgdb_capture 97727137e52SSam Ravnborgxcall_kgdb_capture: 97842cc77c8SDavid S. Miller wr %g0, (1 << PIL_KGDB_CAPTURE), %set_softint 97942cc77c8SDavid S. Miller retry 98027137e52SSam Ravnborg#endif 98127137e52SSam Ravnborg 98227137e52SSam Ravnborg#endif /* CONFIG_SMP */ 98327137e52SSam Ravnborg 984a74ad5e6SDavid S. Miller .globl cheetah_patch_cachetlbops 985a74ad5e6SDavid S. Millercheetah_patch_cachetlbops: 986a74ad5e6SDavid S. Miller save %sp, -128, %sp 987a74ad5e6SDavid S. Miller 988a74ad5e6SDavid S. Miller sethi %hi(__flush_tlb_mm), %o0 989a74ad5e6SDavid S. Miller or %o0, %lo(__flush_tlb_mm), %o0 990a74ad5e6SDavid S. Miller sethi %hi(__cheetah_flush_tlb_mm), %o1 991a74ad5e6SDavid S. Miller or %o1, %lo(__cheetah_flush_tlb_mm), %o1 992a74ad5e6SDavid S. Miller call tlb_patch_one 993a74ad5e6SDavid S. Miller mov 19, %o2 994a74ad5e6SDavid S. Miller 995a74ad5e6SDavid S. Miller sethi %hi(__flush_tlb_page), %o0 996a74ad5e6SDavid S. Miller or %o0, %lo(__flush_tlb_page), %o0 997a74ad5e6SDavid S. Miller sethi %hi(__cheetah_flush_tlb_page), %o1 998a74ad5e6SDavid S. Miller or %o1, %lo(__cheetah_flush_tlb_page), %o1 999a74ad5e6SDavid S. Miller call tlb_patch_one 1000a74ad5e6SDavid S. Miller mov 22, %o2 1001a74ad5e6SDavid S. Miller 1002a74ad5e6SDavid S. Miller sethi %hi(__flush_tlb_pending), %o0 1003a74ad5e6SDavid S. Miller or %o0, %lo(__flush_tlb_pending), %o0 1004a74ad5e6SDavid S. Miller sethi %hi(__cheetah_flush_tlb_pending), %o1 1005a74ad5e6SDavid S. Miller or %o1, %lo(__cheetah_flush_tlb_pending), %o1 1006a74ad5e6SDavid S. Miller call tlb_patch_one 1007a74ad5e6SDavid S. Miller mov 27, %o2 1008a74ad5e6SDavid S. Miller 1009a74ad5e6SDavid S. Miller sethi %hi(__flush_tlb_kernel_range), %o0 1010a74ad5e6SDavid S. Miller or %o0, %lo(__flush_tlb_kernel_range), %o0 1011a74ad5e6SDavid S. Miller sethi %hi(__cheetah_flush_tlb_kernel_range), %o1 1012a74ad5e6SDavid S. Miller or %o1, %lo(__cheetah_flush_tlb_kernel_range), %o1 1013a74ad5e6SDavid S. Miller call tlb_patch_one 1014a74ad5e6SDavid S. Miller mov 31, %o2 1015a74ad5e6SDavid S. Miller 1016a74ad5e6SDavid S. Miller#ifdef DCACHE_ALIASING_POSSIBLE 1017a74ad5e6SDavid S. Miller sethi %hi(__flush_dcache_page), %o0 1018a74ad5e6SDavid S. Miller or %o0, %lo(__flush_dcache_page), %o0 1019a74ad5e6SDavid S. Miller sethi %hi(__cheetah_flush_dcache_page), %o1 1020a74ad5e6SDavid S. Miller or %o1, %lo(__cheetah_flush_dcache_page), %o1 1021a74ad5e6SDavid S. Miller call tlb_patch_one 1022a74ad5e6SDavid S. Miller mov 11, %o2 1023a74ad5e6SDavid S. Miller#endif /* DCACHE_ALIASING_POSSIBLE */ 1024a74ad5e6SDavid S. Miller 1025a74ad5e6SDavid S. Miller#ifdef CONFIG_SMP 1026a74ad5e6SDavid S. Miller sethi %hi(xcall_flush_tlb_kernel_range), %o0 1027a74ad5e6SDavid S. Miller or %o0, %lo(xcall_flush_tlb_kernel_range), %o0 1028a74ad5e6SDavid S. Miller sethi %hi(__cheetah_xcall_flush_tlb_kernel_range), %o1 1029a74ad5e6SDavid S. Miller or %o1, %lo(__cheetah_xcall_flush_tlb_kernel_range), %o1 1030a74ad5e6SDavid S. Miller call tlb_patch_one 1031a74ad5e6SDavid S. Miller mov 44, %o2 1032a74ad5e6SDavid S. Miller#endif /* CONFIG_SMP */ 1033a74ad5e6SDavid S. Miller 1034a74ad5e6SDavid S. Miller ret 1035a74ad5e6SDavid S. Miller restore 103627137e52SSam Ravnborg 103727137e52SSam Ravnborg .globl hypervisor_patch_cachetlbops 103827137e52SSam Ravnborghypervisor_patch_cachetlbops: 103927137e52SSam Ravnborg save %sp, -128, %sp 104027137e52SSam Ravnborg 104127137e52SSam Ravnborg sethi %hi(__flush_tlb_mm), %o0 104227137e52SSam Ravnborg or %o0, %lo(__flush_tlb_mm), %o0 104327137e52SSam Ravnborg sethi %hi(__hypervisor_flush_tlb_mm), %o1 104427137e52SSam Ravnborg or %o1, %lo(__hypervisor_flush_tlb_mm), %o1 104527137e52SSam Ravnborg call tlb_patch_one 1046b429ae4dSDavid S. Miller mov 19, %o2 104727137e52SSam Ravnborg 1048f36391d2SDavid S. Miller sethi %hi(__flush_tlb_page), %o0 1049f36391d2SDavid S. Miller or %o0, %lo(__flush_tlb_page), %o0 1050f36391d2SDavid S. Miller sethi %hi(__hypervisor_flush_tlb_page), %o1 1051f36391d2SDavid S. Miller or %o1, %lo(__hypervisor_flush_tlb_page), %o1 1052f36391d2SDavid S. Miller call tlb_patch_one 1053b429ae4dSDavid S. Miller mov 22, %o2 1054f36391d2SDavid S. Miller 105527137e52SSam Ravnborg sethi %hi(__flush_tlb_pending), %o0 105627137e52SSam Ravnborg or %o0, %lo(__flush_tlb_pending), %o0 105727137e52SSam Ravnborg sethi %hi(__hypervisor_flush_tlb_pending), %o1 105827137e52SSam Ravnborg or %o1, %lo(__hypervisor_flush_tlb_pending), %o1 105927137e52SSam Ravnborg call tlb_patch_one 1060b429ae4dSDavid S. Miller mov 27, %o2 106127137e52SSam Ravnborg 106227137e52SSam Ravnborg sethi %hi(__flush_tlb_kernel_range), %o0 106327137e52SSam Ravnborg or %o0, %lo(__flush_tlb_kernel_range), %o0 106427137e52SSam Ravnborg sethi %hi(__hypervisor_flush_tlb_kernel_range), %o1 106527137e52SSam Ravnborg or %o1, %lo(__hypervisor_flush_tlb_kernel_range), %o1 106627137e52SSam Ravnborg call tlb_patch_one 1067a74ad5e6SDavid S. Miller mov 31, %o2 106827137e52SSam Ravnborg 106927137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE 107027137e52SSam Ravnborg sethi %hi(__flush_dcache_page), %o0 107127137e52SSam Ravnborg or %o0, %lo(__flush_dcache_page), %o0 107227137e52SSam Ravnborg sethi %hi(__hypervisor_flush_dcache_page), %o1 107327137e52SSam Ravnborg or %o1, %lo(__hypervisor_flush_dcache_page), %o1 107427137e52SSam Ravnborg call tlb_patch_one 107527137e52SSam Ravnborg mov 2, %o2 107627137e52SSam Ravnborg#endif /* DCACHE_ALIASING_POSSIBLE */ 107727137e52SSam Ravnborg 107827137e52SSam Ravnborg#ifdef CONFIG_SMP 107927137e52SSam Ravnborg sethi %hi(xcall_flush_tlb_mm), %o0 108027137e52SSam Ravnborg or %o0, %lo(xcall_flush_tlb_mm), %o0 108127137e52SSam Ravnborg sethi %hi(__hypervisor_xcall_flush_tlb_mm), %o1 108227137e52SSam Ravnborg or %o1, %lo(__hypervisor_xcall_flush_tlb_mm), %o1 108327137e52SSam Ravnborg call tlb_patch_one 1084a236441bSDavid S. Miller mov 24, %o2 108527137e52SSam Ravnborg 1086f36391d2SDavid S. Miller sethi %hi(xcall_flush_tlb_page), %o0 1087f36391d2SDavid S. Miller or %o0, %lo(xcall_flush_tlb_page), %o0 1088f36391d2SDavid S. Miller sethi %hi(__hypervisor_xcall_flush_tlb_page), %o1 1089f36391d2SDavid S. Miller or %o1, %lo(__hypervisor_xcall_flush_tlb_page), %o1 109027137e52SSam Ravnborg call tlb_patch_one 1091a236441bSDavid S. Miller mov 20, %o2 109227137e52SSam Ravnborg 109327137e52SSam Ravnborg sethi %hi(xcall_flush_tlb_kernel_range), %o0 109427137e52SSam Ravnborg or %o0, %lo(xcall_flush_tlb_kernel_range), %o0 109527137e52SSam Ravnborg sethi %hi(__hypervisor_xcall_flush_tlb_kernel_range), %o1 109627137e52SSam Ravnborg or %o1, %lo(__hypervisor_xcall_flush_tlb_kernel_range), %o1 109727137e52SSam Ravnborg call tlb_patch_one 1098a74ad5e6SDavid S. Miller mov 44, %o2 109927137e52SSam Ravnborg#endif /* CONFIG_SMP */ 110027137e52SSam Ravnborg 110127137e52SSam Ravnborg ret 110227137e52SSam Ravnborg restore 1103