1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 288278ca2SAdrian Bunk/* 31da177e4SLinus Torvalds * hypersparc.S: High speed Hypersparc mmu/cache operations. 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) 61da177e4SLinus Torvalds */ 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds#include <asm/ptrace.h> 91da177e4SLinus Torvalds#include <asm/psr.h> 1047003497SSam Ravnborg#include <asm/asm-offsets.h> 111da177e4SLinus Torvalds#include <asm/asi.h> 121da177e4SLinus Torvalds#include <asm/page.h> 13*8e958839SWill Deacon#include <asm/pgtable.h> 141da177e4SLinus Torvalds#include <asm/pgtsrmmu.h> 151da177e4SLinus Torvalds#include <linux/init.h> 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds .text 181da177e4SLinus Torvalds .align 4 191da177e4SLinus Torvalds 201da177e4SLinus Torvalds .globl hypersparc_flush_cache_all, hypersparc_flush_cache_mm 211da177e4SLinus Torvalds .globl hypersparc_flush_cache_range, hypersparc_flush_cache_page 221da177e4SLinus Torvalds .globl hypersparc_flush_page_to_ram 231da177e4SLinus Torvalds .globl hypersparc_flush_page_for_dma, hypersparc_flush_sig_insns 241da177e4SLinus Torvalds .globl hypersparc_flush_tlb_all, hypersparc_flush_tlb_mm 251da177e4SLinus Torvalds .globl hypersparc_flush_tlb_range, hypersparc_flush_tlb_page 261da177e4SLinus Torvalds 271da177e4SLinus Torvaldshypersparc_flush_cache_all: 281da177e4SLinus Torvalds WINDOW_FLUSH(%g4, %g5) 291da177e4SLinus Torvalds sethi %hi(vac_cache_size), %g4 301da177e4SLinus Torvalds ld [%g4 + %lo(vac_cache_size)], %g5 311da177e4SLinus Torvalds sethi %hi(vac_line_size), %g1 321da177e4SLinus Torvalds ld [%g1 + %lo(vac_line_size)], %g2 331da177e4SLinus Torvalds1: 341da177e4SLinus Torvalds subcc %g5, %g2, %g5 ! hyper_flush_unconditional_combined 351da177e4SLinus Torvalds bne 1b 361da177e4SLinus Torvalds sta %g0, [%g5] ASI_M_FLUSH_CTX 371da177e4SLinus Torvalds retl 381da177e4SLinus Torvalds sta %g0, [%g0] ASI_M_FLUSH_IWHOLE ! hyper_flush_whole_icache 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds /* We expand the window flush to get maximum performance. */ 411da177e4SLinus Torvaldshypersparc_flush_cache_mm: 421da177e4SLinus Torvalds#ifndef CONFIG_SMP 431da177e4SLinus Torvalds ld [%o0 + AOFF_mm_context], %g1 441da177e4SLinus Torvalds cmp %g1, -1 451da177e4SLinus Torvalds be hypersparc_flush_cache_mm_out 461da177e4SLinus Torvalds#endif 471da177e4SLinus Torvalds WINDOW_FLUSH(%g4, %g5) 481da177e4SLinus Torvalds 491da177e4SLinus Torvalds sethi %hi(vac_line_size), %g1 501da177e4SLinus Torvalds ld [%g1 + %lo(vac_line_size)], %o1 511da177e4SLinus Torvalds sethi %hi(vac_cache_size), %g2 521da177e4SLinus Torvalds ld [%g2 + %lo(vac_cache_size)], %o0 531da177e4SLinus Torvalds add %o1, %o1, %g1 541da177e4SLinus Torvalds add %o1, %g1, %g2 551da177e4SLinus Torvalds add %o1, %g2, %g3 561da177e4SLinus Torvalds add %o1, %g3, %g4 571da177e4SLinus Torvalds add %o1, %g4, %g5 581da177e4SLinus Torvalds add %o1, %g5, %o4 591da177e4SLinus Torvalds add %o1, %o4, %o5 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds /* BLAMMO! */ 621da177e4SLinus Torvalds1: 631da177e4SLinus Torvalds subcc %o0, %o5, %o0 ! hyper_flush_cache_user 641da177e4SLinus Torvalds sta %g0, [%o0 + %g0] ASI_M_FLUSH_USER 651da177e4SLinus Torvalds sta %g0, [%o0 + %o1] ASI_M_FLUSH_USER 661da177e4SLinus Torvalds sta %g0, [%o0 + %g1] ASI_M_FLUSH_USER 671da177e4SLinus Torvalds sta %g0, [%o0 + %g2] ASI_M_FLUSH_USER 681da177e4SLinus Torvalds sta %g0, [%o0 + %g3] ASI_M_FLUSH_USER 691da177e4SLinus Torvalds sta %g0, [%o0 + %g4] ASI_M_FLUSH_USER 701da177e4SLinus Torvalds sta %g0, [%o0 + %g5] ASI_M_FLUSH_USER 711da177e4SLinus Torvalds bne 1b 721da177e4SLinus Torvalds sta %g0, [%o0 + %o4] ASI_M_FLUSH_USER 731da177e4SLinus Torvaldshypersparc_flush_cache_mm_out: 741da177e4SLinus Torvalds retl 751da177e4SLinus Torvalds nop 761da177e4SLinus Torvalds 771da177e4SLinus Torvalds /* The things we do for performance... */ 781da177e4SLinus Torvaldshypersparc_flush_cache_range: 79961246b4SOlivier DANET ld [%o0 + VMA_VM_MM], %o0 801da177e4SLinus Torvalds#ifndef CONFIG_SMP 811da177e4SLinus Torvalds ld [%o0 + AOFF_mm_context], %g1 821da177e4SLinus Torvalds cmp %g1, -1 831da177e4SLinus Torvalds be hypersparc_flush_cache_range_out 841da177e4SLinus Torvalds#endif 851da177e4SLinus Torvalds WINDOW_FLUSH(%g4, %g5) 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds sethi %hi(vac_line_size), %g1 881da177e4SLinus Torvalds ld [%g1 + %lo(vac_line_size)], %o4 891da177e4SLinus Torvalds sethi %hi(vac_cache_size), %g2 901da177e4SLinus Torvalds ld [%g2 + %lo(vac_cache_size)], %o3 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds /* Here comes the fun part... */ 931da177e4SLinus Torvalds add %o2, (PAGE_SIZE - 1), %o2 941da177e4SLinus Torvalds andn %o1, (PAGE_SIZE - 1), %o1 951da177e4SLinus Torvalds add %o4, %o4, %o5 961da177e4SLinus Torvalds andn %o2, (PAGE_SIZE - 1), %o2 971da177e4SLinus Torvalds add %o4, %o5, %g1 981da177e4SLinus Torvalds sub %o2, %o1, %g4 991da177e4SLinus Torvalds add %o4, %g1, %g2 1001da177e4SLinus Torvalds sll %o3, 2, %g5 1011da177e4SLinus Torvalds add %o4, %g2, %g3 1021da177e4SLinus Torvalds cmp %g4, %g5 1031da177e4SLinus Torvalds add %o4, %g3, %g4 1041da177e4SLinus Torvalds blu 0f 1051da177e4SLinus Torvalds add %o4, %g4, %g5 1061da177e4SLinus Torvalds add %o4, %g5, %g7 1071da177e4SLinus Torvalds 1081da177e4SLinus Torvalds /* Flush entire user space, believe it or not this is quicker 1091da177e4SLinus Torvalds * than page at a time flushings for range > (cache_size<<2). 1101da177e4SLinus Torvalds */ 1111da177e4SLinus Torvalds1: 1121da177e4SLinus Torvalds subcc %o3, %g7, %o3 1131da177e4SLinus Torvalds sta %g0, [%o3 + %g0] ASI_M_FLUSH_USER 1141da177e4SLinus Torvalds sta %g0, [%o3 + %o4] ASI_M_FLUSH_USER 1151da177e4SLinus Torvalds sta %g0, [%o3 + %o5] ASI_M_FLUSH_USER 1161da177e4SLinus Torvalds sta %g0, [%o3 + %g1] ASI_M_FLUSH_USER 1171da177e4SLinus Torvalds sta %g0, [%o3 + %g2] ASI_M_FLUSH_USER 1181da177e4SLinus Torvalds sta %g0, [%o3 + %g3] ASI_M_FLUSH_USER 1191da177e4SLinus Torvalds sta %g0, [%o3 + %g4] ASI_M_FLUSH_USER 1201da177e4SLinus Torvalds bne 1b 1211da177e4SLinus Torvalds sta %g0, [%o3 + %g5] ASI_M_FLUSH_USER 1221da177e4SLinus Torvalds retl 1231da177e4SLinus Torvalds nop 1241da177e4SLinus Torvalds 1251da177e4SLinus Torvalds /* Below our threshold, flush one page at a time. */ 1261da177e4SLinus Torvalds0: 1271da177e4SLinus Torvalds ld [%o0 + AOFF_mm_context], %o0 1281da177e4SLinus Torvalds mov SRMMU_CTX_REG, %g7 1291da177e4SLinus Torvalds lda [%g7] ASI_M_MMUREGS, %o3 1301da177e4SLinus Torvalds sta %o0, [%g7] ASI_M_MMUREGS 1311da177e4SLinus Torvalds add %o2, -PAGE_SIZE, %o0 1321da177e4SLinus Torvalds1: 1331da177e4SLinus Torvalds or %o0, 0x400, %g7 1341da177e4SLinus Torvalds lda [%g7] ASI_M_FLUSH_PROBE, %g7 1351da177e4SLinus Torvalds orcc %g7, 0, %g0 1361da177e4SLinus Torvalds be,a 3f 1371da177e4SLinus Torvalds mov %o0, %o2 1381da177e4SLinus Torvalds add %o4, %g5, %g7 1391da177e4SLinus Torvalds2: 1401da177e4SLinus Torvalds sub %o2, %g7, %o2 1411da177e4SLinus Torvalds sta %g0, [%o2 + %g0] ASI_M_FLUSH_PAGE 1421da177e4SLinus Torvalds sta %g0, [%o2 + %o4] ASI_M_FLUSH_PAGE 1431da177e4SLinus Torvalds sta %g0, [%o2 + %o5] ASI_M_FLUSH_PAGE 1441da177e4SLinus Torvalds sta %g0, [%o2 + %g1] ASI_M_FLUSH_PAGE 1451da177e4SLinus Torvalds sta %g0, [%o2 + %g2] ASI_M_FLUSH_PAGE 1461da177e4SLinus Torvalds sta %g0, [%o2 + %g3] ASI_M_FLUSH_PAGE 1471da177e4SLinus Torvalds andcc %o2, 0xffc, %g0 1481da177e4SLinus Torvalds sta %g0, [%o2 + %g4] ASI_M_FLUSH_PAGE 1491da177e4SLinus Torvalds bne 2b 1501da177e4SLinus Torvalds sta %g0, [%o2 + %g5] ASI_M_FLUSH_PAGE 1511da177e4SLinus Torvalds3: 1521da177e4SLinus Torvalds cmp %o2, %o1 1531da177e4SLinus Torvalds bne 1b 1541da177e4SLinus Torvalds add %o2, -PAGE_SIZE, %o0 1551da177e4SLinus Torvalds mov SRMMU_FAULT_STATUS, %g5 1561da177e4SLinus Torvalds lda [%g5] ASI_M_MMUREGS, %g0 1571da177e4SLinus Torvalds mov SRMMU_CTX_REG, %g7 1581da177e4SLinus Torvalds sta %o3, [%g7] ASI_M_MMUREGS 1591da177e4SLinus Torvaldshypersparc_flush_cache_range_out: 1601da177e4SLinus Torvalds retl 1611da177e4SLinus Torvalds nop 1621da177e4SLinus Torvalds 1631da177e4SLinus Torvalds /* HyperSparc requires a valid mapping where we are about to flush 1641da177e4SLinus Torvalds * in order to check for a physical tag match during the flush. 1651da177e4SLinus Torvalds */ 1661da177e4SLinus Torvalds /* Verified, my ass... */ 1671da177e4SLinus Torvaldshypersparc_flush_cache_page: 168961246b4SOlivier DANET ld [%o0 + VMA_VM_MM], %o0 1691da177e4SLinus Torvalds ld [%o0 + AOFF_mm_context], %g2 1701da177e4SLinus Torvalds#ifndef CONFIG_SMP 1711da177e4SLinus Torvalds cmp %g2, -1 1721da177e4SLinus Torvalds be hypersparc_flush_cache_page_out 1731da177e4SLinus Torvalds#endif 1741da177e4SLinus Torvalds WINDOW_FLUSH(%g4, %g5) 1751da177e4SLinus Torvalds 1761da177e4SLinus Torvalds sethi %hi(vac_line_size), %g1 1771da177e4SLinus Torvalds ld [%g1 + %lo(vac_line_size)], %o4 1781da177e4SLinus Torvalds mov SRMMU_CTX_REG, %o3 1791da177e4SLinus Torvalds andn %o1, (PAGE_SIZE - 1), %o1 1801da177e4SLinus Torvalds lda [%o3] ASI_M_MMUREGS, %o2 1811da177e4SLinus Torvalds sta %g2, [%o3] ASI_M_MMUREGS 1821da177e4SLinus Torvalds or %o1, 0x400, %o5 1831da177e4SLinus Torvalds lda [%o5] ASI_M_FLUSH_PROBE, %g1 1841da177e4SLinus Torvalds orcc %g0, %g1, %g0 1851da177e4SLinus Torvalds be 2f 1861da177e4SLinus Torvalds add %o4, %o4, %o5 1871da177e4SLinus Torvalds sub %o1, -PAGE_SIZE, %o1 1881da177e4SLinus Torvalds add %o4, %o5, %g1 1891da177e4SLinus Torvalds add %o4, %g1, %g2 1901da177e4SLinus Torvalds add %o4, %g2, %g3 1911da177e4SLinus Torvalds add %o4, %g3, %g4 1921da177e4SLinus Torvalds add %o4, %g4, %g5 1931da177e4SLinus Torvalds add %o4, %g5, %g7 1941da177e4SLinus Torvalds 1951da177e4SLinus Torvalds /* BLAMMO! */ 1961da177e4SLinus Torvalds1: 1971da177e4SLinus Torvalds sub %o1, %g7, %o1 1981da177e4SLinus Torvalds sta %g0, [%o1 + %g0] ASI_M_FLUSH_PAGE 1991da177e4SLinus Torvalds sta %g0, [%o1 + %o4] ASI_M_FLUSH_PAGE 2001da177e4SLinus Torvalds sta %g0, [%o1 + %o5] ASI_M_FLUSH_PAGE 2011da177e4SLinus Torvalds sta %g0, [%o1 + %g1] ASI_M_FLUSH_PAGE 2021da177e4SLinus Torvalds sta %g0, [%o1 + %g2] ASI_M_FLUSH_PAGE 2031da177e4SLinus Torvalds sta %g0, [%o1 + %g3] ASI_M_FLUSH_PAGE 2041da177e4SLinus Torvalds andcc %o1, 0xffc, %g0 2051da177e4SLinus Torvalds sta %g0, [%o1 + %g4] ASI_M_FLUSH_PAGE 2061da177e4SLinus Torvalds bne 1b 2071da177e4SLinus Torvalds sta %g0, [%o1 + %g5] ASI_M_FLUSH_PAGE 2081da177e4SLinus Torvalds2: 2091da177e4SLinus Torvalds mov SRMMU_FAULT_STATUS, %g7 2101da177e4SLinus Torvalds mov SRMMU_CTX_REG, %g4 2111da177e4SLinus Torvalds lda [%g7] ASI_M_MMUREGS, %g0 2121da177e4SLinus Torvalds sta %o2, [%g4] ASI_M_MMUREGS 2131da177e4SLinus Torvaldshypersparc_flush_cache_page_out: 2141da177e4SLinus Torvalds retl 2151da177e4SLinus Torvalds nop 2161da177e4SLinus Torvalds 2171da177e4SLinus Torvaldshypersparc_flush_sig_insns: 2181da177e4SLinus Torvalds flush %o1 2191da177e4SLinus Torvalds retl 2201da177e4SLinus Torvalds flush %o1 + 4 2211da177e4SLinus Torvalds 2221da177e4SLinus Torvalds /* HyperSparc is copy-back. */ 2231da177e4SLinus Torvaldshypersparc_flush_page_to_ram: 2241da177e4SLinus Torvalds sethi %hi(vac_line_size), %g1 2251da177e4SLinus Torvalds ld [%g1 + %lo(vac_line_size)], %o4 2261da177e4SLinus Torvalds andn %o0, (PAGE_SIZE - 1), %o0 2271da177e4SLinus Torvalds add %o4, %o4, %o5 2281da177e4SLinus Torvalds or %o0, 0x400, %g7 2291da177e4SLinus Torvalds lda [%g7] ASI_M_FLUSH_PROBE, %g5 2301da177e4SLinus Torvalds add %o4, %o5, %g1 2311da177e4SLinus Torvalds orcc %g5, 0, %g0 2321da177e4SLinus Torvalds be 2f 2331da177e4SLinus Torvalds add %o4, %g1, %g2 2341da177e4SLinus Torvalds add %o4, %g2, %g3 2351da177e4SLinus Torvalds sub %o0, -PAGE_SIZE, %o0 2361da177e4SLinus Torvalds add %o4, %g3, %g4 2371da177e4SLinus Torvalds add %o4, %g4, %g5 2381da177e4SLinus Torvalds add %o4, %g5, %g7 2391da177e4SLinus Torvalds 2401da177e4SLinus Torvalds /* BLAMMO! */ 2411da177e4SLinus Torvalds1: 2421da177e4SLinus Torvalds sub %o0, %g7, %o0 2431da177e4SLinus Torvalds sta %g0, [%o0 + %g0] ASI_M_FLUSH_PAGE 2441da177e4SLinus Torvalds sta %g0, [%o0 + %o4] ASI_M_FLUSH_PAGE 2451da177e4SLinus Torvalds sta %g0, [%o0 + %o5] ASI_M_FLUSH_PAGE 2461da177e4SLinus Torvalds sta %g0, [%o0 + %g1] ASI_M_FLUSH_PAGE 2471da177e4SLinus Torvalds sta %g0, [%o0 + %g2] ASI_M_FLUSH_PAGE 2481da177e4SLinus Torvalds sta %g0, [%o0 + %g3] ASI_M_FLUSH_PAGE 2491da177e4SLinus Torvalds andcc %o0, 0xffc, %g0 2501da177e4SLinus Torvalds sta %g0, [%o0 + %g4] ASI_M_FLUSH_PAGE 2511da177e4SLinus Torvalds bne 1b 2521da177e4SLinus Torvalds sta %g0, [%o0 + %g5] ASI_M_FLUSH_PAGE 2531da177e4SLinus Torvalds2: 2541da177e4SLinus Torvalds mov SRMMU_FAULT_STATUS, %g1 2551da177e4SLinus Torvalds retl 2561da177e4SLinus Torvalds lda [%g1] ASI_M_MMUREGS, %g0 2571da177e4SLinus Torvalds 2581da177e4SLinus Torvalds /* HyperSparc is IO cache coherent. */ 2591da177e4SLinus Torvaldshypersparc_flush_page_for_dma: 2601da177e4SLinus Torvalds retl 2611da177e4SLinus Torvalds nop 2621da177e4SLinus Torvalds 2631da177e4SLinus Torvalds /* It was noted that at boot time a TLB flush all in a delay slot 2641da177e4SLinus Torvalds * can deliver an illegal instruction to the processor if the timing 2651da177e4SLinus Torvalds * is just right... 2661da177e4SLinus Torvalds */ 2671da177e4SLinus Torvaldshypersparc_flush_tlb_all: 2681da177e4SLinus Torvalds mov 0x400, %g1 2691da177e4SLinus Torvalds sta %g0, [%g1] ASI_M_FLUSH_PROBE 2701da177e4SLinus Torvalds retl 2711da177e4SLinus Torvalds nop 2721da177e4SLinus Torvalds 2731da177e4SLinus Torvaldshypersparc_flush_tlb_mm: 2741da177e4SLinus Torvalds mov SRMMU_CTX_REG, %g1 2751da177e4SLinus Torvalds ld [%o0 + AOFF_mm_context], %o1 2761da177e4SLinus Torvalds lda [%g1] ASI_M_MMUREGS, %g5 2771da177e4SLinus Torvalds#ifndef CONFIG_SMP 2781da177e4SLinus Torvalds cmp %o1, -1 2791da177e4SLinus Torvalds be hypersparc_flush_tlb_mm_out 2801da177e4SLinus Torvalds#endif 2811da177e4SLinus Torvalds mov 0x300, %g2 2821da177e4SLinus Torvalds sta %o1, [%g1] ASI_M_MMUREGS 2831da177e4SLinus Torvalds sta %g0, [%g2] ASI_M_FLUSH_PROBE 2841da177e4SLinus Torvaldshypersparc_flush_tlb_mm_out: 2851da177e4SLinus Torvalds retl 2861da177e4SLinus Torvalds sta %g5, [%g1] ASI_M_MMUREGS 2871da177e4SLinus Torvalds 2881da177e4SLinus Torvaldshypersparc_flush_tlb_range: 289961246b4SOlivier DANET ld [%o0 + VMA_VM_MM], %o0 2901da177e4SLinus Torvalds mov SRMMU_CTX_REG, %g1 2911da177e4SLinus Torvalds ld [%o0 + AOFF_mm_context], %o3 2921da177e4SLinus Torvalds lda [%g1] ASI_M_MMUREGS, %g5 2931da177e4SLinus Torvalds#ifndef CONFIG_SMP 2941da177e4SLinus Torvalds cmp %o3, -1 2951da177e4SLinus Torvalds be hypersparc_flush_tlb_range_out 2961da177e4SLinus Torvalds#endif 297*8e958839SWill Deacon sethi %hi(~((1 << PGDIR_SHIFT) - 1)), %o4 2981da177e4SLinus Torvalds sta %o3, [%g1] ASI_M_MMUREGS 2991da177e4SLinus Torvalds and %o1, %o4, %o1 3001da177e4SLinus Torvalds add %o1, 0x200, %o1 3011da177e4SLinus Torvalds sta %g0, [%o1] ASI_M_FLUSH_PROBE 3021da177e4SLinus Torvalds1: 3031da177e4SLinus Torvalds sub %o1, %o4, %o1 3041da177e4SLinus Torvalds cmp %o1, %o2 3051da177e4SLinus Torvalds blu,a 1b 3061da177e4SLinus Torvalds sta %g0, [%o1] ASI_M_FLUSH_PROBE 3071da177e4SLinus Torvaldshypersparc_flush_tlb_range_out: 3081da177e4SLinus Torvalds retl 3091da177e4SLinus Torvalds sta %g5, [%g1] ASI_M_MMUREGS 3101da177e4SLinus Torvalds 3111da177e4SLinus Torvaldshypersparc_flush_tlb_page: 312961246b4SOlivier DANET ld [%o0 + VMA_VM_MM], %o0 3131da177e4SLinus Torvalds mov SRMMU_CTX_REG, %g1 3141da177e4SLinus Torvalds ld [%o0 + AOFF_mm_context], %o3 3151da177e4SLinus Torvalds andn %o1, (PAGE_SIZE - 1), %o1 3161da177e4SLinus Torvalds#ifndef CONFIG_SMP 3171da177e4SLinus Torvalds cmp %o3, -1 3181da177e4SLinus Torvalds be hypersparc_flush_tlb_page_out 3191da177e4SLinus Torvalds#endif 3201da177e4SLinus Torvalds lda [%g1] ASI_M_MMUREGS, %g5 3211da177e4SLinus Torvalds sta %o3, [%g1] ASI_M_MMUREGS 3221da177e4SLinus Torvalds sta %g0, [%o1] ASI_M_FLUSH_PROBE 3231da177e4SLinus Torvaldshypersparc_flush_tlb_page_out: 3241da177e4SLinus Torvalds retl 3251da177e4SLinus Torvalds sta %g5, [%g1] ASI_M_MMUREGS 3261da177e4SLinus Torvalds 3271da177e4SLinus Torvalds __INIT 3281da177e4SLinus Torvalds 3291da177e4SLinus Torvalds /* High speed page clear/copy. */ 3301da177e4SLinus Torvaldshypersparc_bzero_1page: 3311da177e4SLinus Torvalds/* NOTE: This routine has to be shorter than 40insns --jj */ 3321da177e4SLinus Torvalds clr %g1 3331da177e4SLinus Torvalds mov 32, %g2 3341da177e4SLinus Torvalds mov 64, %g3 3351da177e4SLinus Torvalds mov 96, %g4 3361da177e4SLinus Torvalds mov 128, %g5 3371da177e4SLinus Torvalds mov 160, %g7 3381da177e4SLinus Torvalds mov 192, %o2 3391da177e4SLinus Torvalds mov 224, %o3 3401da177e4SLinus Torvalds mov 16, %o1 3411da177e4SLinus Torvalds1: 3421da177e4SLinus Torvalds stda %g0, [%o0 + %g0] ASI_M_BFILL 3431da177e4SLinus Torvalds stda %g0, [%o0 + %g2] ASI_M_BFILL 3441da177e4SLinus Torvalds stda %g0, [%o0 + %g3] ASI_M_BFILL 3451da177e4SLinus Torvalds stda %g0, [%o0 + %g4] ASI_M_BFILL 3461da177e4SLinus Torvalds stda %g0, [%o0 + %g5] ASI_M_BFILL 3471da177e4SLinus Torvalds stda %g0, [%o0 + %g7] ASI_M_BFILL 3481da177e4SLinus Torvalds stda %g0, [%o0 + %o2] ASI_M_BFILL 3491da177e4SLinus Torvalds stda %g0, [%o0 + %o3] ASI_M_BFILL 3501da177e4SLinus Torvalds subcc %o1, 1, %o1 3511da177e4SLinus Torvalds bne 1b 3521da177e4SLinus Torvalds add %o0, 256, %o0 3531da177e4SLinus Torvalds 3541da177e4SLinus Torvalds retl 3551da177e4SLinus Torvalds nop 3561da177e4SLinus Torvalds 3571da177e4SLinus Torvaldshypersparc_copy_1page: 3581da177e4SLinus Torvalds/* NOTE: This routine has to be shorter than 70insns --jj */ 3591da177e4SLinus Torvalds sub %o1, %o0, %o2 ! difference 3601da177e4SLinus Torvalds mov 16, %g1 3611da177e4SLinus Torvalds1: 3621da177e4SLinus Torvalds sta %o0, [%o0 + %o2] ASI_M_BCOPY 3631da177e4SLinus Torvalds add %o0, 32, %o0 3641da177e4SLinus Torvalds sta %o0, [%o0 + %o2] ASI_M_BCOPY 3651da177e4SLinus Torvalds add %o0, 32, %o0 3661da177e4SLinus Torvalds sta %o0, [%o0 + %o2] ASI_M_BCOPY 3671da177e4SLinus Torvalds add %o0, 32, %o0 3681da177e4SLinus Torvalds sta %o0, [%o0 + %o2] ASI_M_BCOPY 3691da177e4SLinus Torvalds add %o0, 32, %o0 3701da177e4SLinus Torvalds sta %o0, [%o0 + %o2] ASI_M_BCOPY 3711da177e4SLinus Torvalds add %o0, 32, %o0 3721da177e4SLinus Torvalds sta %o0, [%o0 + %o2] ASI_M_BCOPY 3731da177e4SLinus Torvalds add %o0, 32, %o0 3741da177e4SLinus Torvalds sta %o0, [%o0 + %o2] ASI_M_BCOPY 3751da177e4SLinus Torvalds add %o0, 32, %o0 3761da177e4SLinus Torvalds sta %o0, [%o0 + %o2] ASI_M_BCOPY 3771da177e4SLinus Torvalds subcc %g1, 1, %g1 3781da177e4SLinus Torvalds bne 1b 3791da177e4SLinus Torvalds add %o0, 32, %o0 3801da177e4SLinus Torvalds 3811da177e4SLinus Torvalds retl 3821da177e4SLinus Torvalds nop 3831da177e4SLinus Torvalds 3841da177e4SLinus Torvalds .globl hypersparc_setup_blockops 3851da177e4SLinus Torvaldshypersparc_setup_blockops: 3861da177e4SLinus Torvalds sethi %hi(bzero_1page), %o0 3871da177e4SLinus Torvalds or %o0, %lo(bzero_1page), %o0 3881da177e4SLinus Torvalds sethi %hi(hypersparc_bzero_1page), %o1 3891da177e4SLinus Torvalds or %o1, %lo(hypersparc_bzero_1page), %o1 3901da177e4SLinus Torvalds sethi %hi(hypersparc_copy_1page), %o2 3911da177e4SLinus Torvalds or %o2, %lo(hypersparc_copy_1page), %o2 3921da177e4SLinus Torvalds ld [%o1], %o4 3931da177e4SLinus Torvalds1: 3941da177e4SLinus Torvalds add %o1, 4, %o1 3951da177e4SLinus Torvalds st %o4, [%o0] 3961da177e4SLinus Torvalds add %o0, 4, %o0 3971da177e4SLinus Torvalds cmp %o1, %o2 3981da177e4SLinus Torvalds bne 1b 3991da177e4SLinus Torvalds ld [%o1], %o4 4001da177e4SLinus Torvalds sethi %hi(__copy_1page), %o0 4011da177e4SLinus Torvalds or %o0, %lo(__copy_1page), %o0 4021da177e4SLinus Torvalds sethi %hi(hypersparc_setup_blockops), %o2 4031da177e4SLinus Torvalds or %o2, %lo(hypersparc_setup_blockops), %o2 4041da177e4SLinus Torvalds ld [%o1], %o4 4051da177e4SLinus Torvalds1: 4061da177e4SLinus Torvalds add %o1, 4, %o1 4071da177e4SLinus Torvalds st %o4, [%o0] 4081da177e4SLinus Torvalds add %o0, 4, %o0 4091da177e4SLinus Torvalds cmp %o1, %o2 4101da177e4SLinus Torvalds bne 1b 4111da177e4SLinus Torvalds ld [%o1], %o4 4121da177e4SLinus Torvalds sta %g0, [%g0] ASI_M_FLUSH_IWHOLE 4131da177e4SLinus Torvalds retl 4141da177e4SLinus Torvalds nop 415