03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Common Development and Distribution License (the "License").
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You may not use this file except in compliance with the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * or http://www.opensolaris.org/os/licensing.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * When distributing Covered Code, include this CDDL HEADER in each
03831d35f7499c87d51205817c93e9a8d42c4baestevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If applicable, add the following below this CDDL HEADER, with the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * fields enclosed by brackets "[]" replaced with your own identifying
03831d35f7499c87d51205817c93e9a8d42c4baestevel * information: Portions Copyright [yyyy] [name of copyright owner]
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER END
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#pragma ident "%Z%%M% %I% %E% SMI"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This file is through cpp before being used as
03831d35f7499c87d51205817c93e9a8d42c4baestevel * an inline. It contains support routines used
03831d35f7499c87d51205817c93e9a8d42c4baestevel * only by DR for the copy-rename sequence.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#if defined(lint)
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/types.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sbd_ioctl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sbdp_priv.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#else
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "assym.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif /* lint */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/asm_linkage.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/param.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/privregs.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/machasi.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/mmu.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/machthread.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/pte.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/stack.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/vis.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/param.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/errno.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/vtrace.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/clock.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/asi.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/fsr.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/cheetahregs.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/cheetahasm.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifndef lint
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Invalidating the E$ tags is only needed on Cheetah following
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the manual displacement flush. The internal flush ASI used by
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Cheetahplus, Jaguar, and Panther will invalidate the cache lines.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * arg1 = ecache_size
03831d35f7499c87d51205817c93e9a8d42c4baestevel * arg2 = ecache_linesize
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define ECACHE_FLUSHTAGS(arg1, arg2, tmp1) \
03831d35f7499c87d51205817c93e9a8d42c4baestevel GET_CPU_IMPL(tmp1) ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel srlx arg1, 1, arg1 ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmp tmp1, CHEETAH_IMPL ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel bne 1f ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel nop ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel sub arg1, arg2, tmp1 ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel0: ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel stxa %g0, [tmp1]ASI_EC_DIAG ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #Sync ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmp %g0, tmp1 ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel bne,pt %icc, 0b ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel sub tmp1, arg2, tmp1 ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel1:
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SWITCH_STACK(estk) \
03831d35f7499c87d51205817c93e9a8d42c4baestevel flushw ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel sub estk, SA(KFPUSIZE+GSR_SIZE), estk ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel andn estk, 0x3f, estk ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel sub estk, SA(MINFRAME) + STACK_BIAS, %sp ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel mov estk, %fp
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Returns icache size and linesize in reg1 and reg2, respectively.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Panther has a larger icache compared to Cheetahplus and Jaguar.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define GET_ICACHE_PARAMS(reg1, reg2) \
03831d35f7499c87d51205817c93e9a8d42c4baestevel GET_CPU_IMPL(reg1) ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmp reg1, PANTHER_IMPL ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel bne %xcc, 1f ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel nop ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel set PN_ICACHE_SIZE, reg1 ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel set PN_ICACHE_LSIZE, reg2 ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel ba 2f ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel nop ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel1: ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel set CH_ICACHE_SIZE, reg1 ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel set CH_ICACHE_LSIZE, reg2 ;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel2:
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif /* !lint */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#if defined(lint)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_shutdown_asm(sbdp_shutdown_t *shutshown)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#else /* lint */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENTRY_NP(sbdp_shutdown_asm)
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! %o0 = address of sbdp_shutdown_t structure passed in
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! struct sbdp_shutdown {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! uint64_t estack; -> %o0
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! uint64_t flushaddr; -> %o1
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! uint32_t size; -> %o2
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! uint32_t linesize; -> %g1
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! uint64_t physaddr; -> %o0
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! } sbdp_shutdown_t;
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #LoadStore
03831d35f7499c87d51205817c93e9a8d42c4baestevel mov %o0, %o4
03831d35f7499c87d51205817c93e9a8d42c4baestevel ldx [%o4], %o0
03831d35f7499c87d51205817c93e9a8d42c4baestevel ldx [%o4 + 8], %o1
03831d35f7499c87d51205817c93e9a8d42c4baestevel ld [%o4 + 16], %o2
03831d35f7499c87d51205817c93e9a8d42c4baestevel ld [%o4 + 20], %g1
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! Switch stack pointer to bbsram
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel SWITCH_STACK(%o0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ldx [%o4 + 24], %o0 !save physaddr in %o0
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! Get some globals
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! ecache_linesize already in %g1
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sethi %hi(dcache_linesize), %g2
03831d35f7499c87d51205817c93e9a8d42c4baestevel ld [%g2 + %lo(dcache_linesize)], %g2
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sethi %hi(dcache_size), %g3
03831d35f7499c87d51205817c93e9a8d42c4baestevel ld [%g3 + %lo(dcache_size)], %g3
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! Save the E$ size
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel mov %o2, %o5
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! Flush E$
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel rdpr %pstate, %o3
03831d35f7499c87d51205817c93e9a8d42c4baestevel andn %o3, PSTATE_IE | PSTATE_AM, %o4
03831d35f7499c87d51205817c93e9a8d42c4baestevel wrpr %g0, %o4, %pstate
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! Panther needs to flush L2 before L3 cache.
03831d35f7499c87d51205817c93e9a8d42c4baestevel PN_L2_FLUSHALL(%o4, %g4, %g5)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ECACHE_FLUSHALL(%o2, %g1, %o1, %o4)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel wrpr %g0, %o3, %pstate
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! Invalidate the E$ tags (Cheetah only).
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ECACHE_FLUSHTAGS(%o5, %g1, %o3)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! %o2 & %o3 now available
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #Sync
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! Flush D$
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel CH_DCACHE_FLUSHALL(%g3, %g2, %o3)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! Flush I$
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel GET_ICACHE_PARAMS(%g5, %g4)
03831d35f7499c87d51205817c93e9a8d42c4baestevel CH_ICACHE_FLUSHALL(%g5, %g4, %o3, %o4)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #Sync
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! Flush all unlocked dtlb's & itlb's
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel sethi %hi(FLUSH_ADDR), %g3
03831d35f7499c87d51205817c93e9a8d42c4baestevel set DEMAP_ALL_TYPE, %g1
03831d35f7499c87d51205817c93e9a8d42c4baestevel stxa %g0, [%g1]ASI_DTLB_DEMAP
03831d35f7499c87d51205817c93e9a8d42c4baestevel stxa %g0, [%g1]ASI_ITLB_DEMAP
03831d35f7499c87d51205817c93e9a8d42c4baestevel flush %g3
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sir 0
03831d35f7499c87d51205817c93e9a8d42c4baestevel SET_SIZE(sbdp_shutdown_asm)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel .global sbdp_shutdown_asm_end
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel .skip 2048
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_shutdown_asm_end:
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif /* lint */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#if defined(lint)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#else /* lint */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "assym.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif /* lint */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define TT_HSM 0x99
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#if defined(lint)
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsgdr_mem_blkcopy(caddr_t src, caddr_t dst, u_int linecount, u_int linesize)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelstdmcdecode(uint64_t physaddr, uint64_t value)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel physaddr = physaddr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = value;
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#else /* !lint */
03831d35f7499c87d51205817c93e9a8d42c4baestevel!
03831d35f7499c87d51205817c93e9a8d42c4baestevel! Move a single cache line of data. Survive UE and CE on the read
03831d35f7499c87d51205817c93e9a8d42c4baestevel!
03831d35f7499c87d51205817c93e9a8d42c4baestevel! i0 = src va
03831d35f7499c87d51205817c93e9a8d42c4baestevel! i1 = dst va
03831d35f7499c87d51205817c93e9a8d42c4baestevel! i2 = line count
03831d35f7499c87d51205817c93e9a8d42c4baestevel! i3 = line size
03831d35f7499c87d51205817c93e9a8d42c4baestevel! i4 = cache of fpu state
03831d35f7499c87d51205817c93e9a8d42c4baestevel!
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENTRY(sgdr_mem_blkcopy)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! TODO: can we safely SAVE here
03831d35f7499c87d51205817c93e9a8d42c4baestevel save %sp, -SA(MINFRAME + 2*64), %sp
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! XXX do we need to save the state of the fpu?
03831d35f7499c87d51205817c93e9a8d42c4baestevel rd %fprs, %i4
03831d35f7499c87d51205817c93e9a8d42c4baestevel btst (FPRS_DU|FPRS_DL|FPRS_FEF), %i4
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! always enable FPU
03831d35f7499c87d51205817c93e9a8d42c4baestevel wr %g0, FPRS_FEF, %fprs
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bz,a 1f
03831d35f7499c87d51205817c93e9a8d42c4baestevel nop
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! save in-use fpregs on stack
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #Sync
03831d35f7499c87d51205817c93e9a8d42c4baestevel add %fp, STACK_BIAS - 81, %o2
03831d35f7499c87d51205817c93e9a8d42c4baestevel and %o2, -64, %o2
03831d35f7499c87d51205817c93e9a8d42c4baestevel stda %d0, [%o2]ASI_BLK_P
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #Sync
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel1:
03831d35f7499c87d51205817c93e9a8d42c4baestevel brz,pn %i2, 2f ! while (linecount) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel nop
03831d35f7499c87d51205817c93e9a8d42c4baestevel ldda [%i0]ASI_BLK_P, %d0 ! *dst = *src;
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #Sync
03831d35f7499c87d51205817c93e9a8d42c4baestevel stda %d0, [%i1]ASI_BLK_COMMIT_P
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #Sync
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel add %i0, %i3, %i0 ! dst++, src++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel add %i1, %i3, %i1
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ba 1b ! linecount-- }
03831d35f7499c87d51205817c93e9a8d42c4baestevel dec %i2
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel2:
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #Sync
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! restore fp to the way we got it
03831d35f7499c87d51205817c93e9a8d42c4baestevel btst (FPRS_DU|FPRS_DL|FPRS_FEF), %i4
03831d35f7499c87d51205817c93e9a8d42c4baestevel bz,a 3f
03831d35f7499c87d51205817c93e9a8d42c4baestevel nop
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! restore fpregs from stack
03831d35f7499c87d51205817c93e9a8d42c4baestevel add %fp, STACK_BIAS - 81, %o2
03831d35f7499c87d51205817c93e9a8d42c4baestevel and %o2, -64, %o2
03831d35f7499c87d51205817c93e9a8d42c4baestevel ldda [%o2]ASI_BLK_P, %d0
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #Sync
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel3:
03831d35f7499c87d51205817c93e9a8d42c4baestevel wr %g0, %i4, %fprs ! fpu back to the way it was
03831d35f7499c87d51205817c93e9a8d42c4baestevel ret
03831d35f7499c87d51205817c93e9a8d42c4baestevel restore
03831d35f7499c87d51205817c93e9a8d42c4baestevel SET_SIZE(sgdr_mem_blkcopy)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! Store long word value at mc regs
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ! void stdmcdecode(uint64_t physaddr, uint64_t value)
03831d35f7499c87d51205817c93e9a8d42c4baestevel !
03831d35f7499c87d51205817c93e9a8d42c4baestevel ENTRY(stdmcdecode)
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * disable interrupts, clear Address Mask to access 64 bit physaddr
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel rdpr %pstate, %o4
03831d35f7499c87d51205817c93e9a8d42c4baestevel andn %o4, PSTATE_IE | PSTATE_AM, %o5
03831d35f7499c87d51205817c93e9a8d42c4baestevel wrpr %o5, 0, %pstate ! clear IE, AM bits
03831d35f7499c87d51205817c93e9a8d42c4baestevel stxa %o1, [%o0]ASI_MC_DECODE
03831d35f7499c87d51205817c93e9a8d42c4baestevel membar #Sync
03831d35f7499c87d51205817c93e9a8d42c4baestevel retl
03831d35f7499c87d51205817c93e9a8d42c4baestevel wrpr %g0, %o4, %pstate ! restore earlier pstate register value
03831d35f7499c87d51205817c93e9a8d42c4baestevel SET_SIZE(stdmcdecode)
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif /* lint */