* ========== Copyright Header Begin ==========================================
* Hypervisor Software File: errs_common.s
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
* - Do no alter or remove copyright notices
* - Redistribution and use of this software in source and binary forms, with
* or without modification, are permitted provided that the following
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of Sun Microsystems, Inc. or the names of contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
* MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
* OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
* DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
* SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* You acknowledge that this software is not designed, licensed or
* intended for use in the design, construction, operation or maintenance of
* ========== Copyright Header End ============================================
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
.ident "@(#)errs_common.s 1.8 07/05/03 SMI"
#include <sys/asm_linkage.h>
* send_diag_erpt - send the diag error report. The offset of the error
* report buffwe is passed in as E_OFF
* %g4 - %g6 used and garbbled
* For service delivery the flag is not cleared until the packet
* has been received (ACK) by the SP, this ensures that we dont trample
* on the current report in the sram while the notify packet is being delivered
#if defined(CONFIG_FPGA) && defined(CONFIG_SVC)
CPU_PUSH(%g7, %g4, %g5, %g6) /* save return addr */
CPU_PUSH(%g2, %g4, %g5, %g6) /* save unsent flag ptr */
add %g6, CONFIG_SRAM_ERPT_BUF_INUSE, %g5
brnz,pn %g4, 1f /* buf busy, flag it */
ldx [%g6 + CONFIG_ERPT_PA], %g2 /* erpt buffer (dest) */
brz %g2, 2f /* no buffer */
add %g2, 7, %g2 /* align pa */
HVCALL(xcopy) /* send erpt */
ldx [%g6 + CONFIG_ERROR_SVCH], %g1 /* error service */
brz %g1, 2f /* skip if no svc */
add %g6, CONFIG_ERPT_PA, %g2 /* error present pkt */
add %g0, ERPT_SVC_PKT_SIZE, %g3 /* pkt len */
HVCALL(svc_internal_send) /* send erpt */
ldx [%g2 + CPU_ROOT], %g6 /* config data */
CPU_POP(%g4, %g1, %g2, %g3) /* restore unsent flag ptr */
st %g0, [%g4] /* flag as no need to send */
CPU_POP(%g7, %g1, %g2, %g3) /* restore callers return */
* SRAM is busy, flag so it gets sent later
* %g6 still contains the ROOT
CPU_POP(%g4, %g1, %g2, %g3)
st %g3, [%g4] /* flag pkt */
add %g6, CONFIG_ERRS_TO_SEND, %g6
CPU_POP(%g7, %g1, %g2, %g3) /* restore callers return */
CPU_POP(%g4, %g1, %g2, %g3) /* pop unsent flag ptr */
CPU_POP(%g7, %g1, %g2, %g3) /* restore callers return */
#else /* !(CONFIG_FPGA && CONFIG_SVC) */
#endif /* CONFIG_FPGA && CONFIG_SVC */
* send_diag_erpt_nolock - send the diag error report. The offset of the error
* report buffwe is passed in as E_OFF
* %g4 - %g6 used and garbbled
* For service delivery the flag is not cleared until the packet
* has been received (ACK) by the SP, this ensures that we dont trample
* on the current report in the sram while the notify packet is being delivered
ENTRY_NP(send_diag_erpt_nolock)
#if defined(CONFIG_FPGA) && defined(CONFIG_SVC)
CPU_PUSH(%g7, %g4, %g5, %g6) /* save unsent flag ptr */
CPU_PUSH(%g2, %g4, %g5, %g6) /* save return addr */
add %g6, CONFIG_SRAM_ERPT_BUF_INUSE, %g5
brnz,pn %g4, 1f /* buf busy, flag it */
ldx [%g6 + CONFIG_ERPT_PA], %g2 /* erpt buffer (dest) */
brz %g2, 2f /* no buffer */
add %g2, 7, %g2 /* align pa */
HVCALL(xcopy) /* send erpt */
ldx [%g6 + CONFIG_ERROR_SVCH], %g1 /* error service */
brz %g1, 2f /* skip if no svc */
add %g6, CONFIG_ERPT_PA, %g2 /* error present pkt */
add %g0, ERPT_SVC_PKT_SIZE, %g3 /* pkt len */
HVCALL(svc_internal_send_nolock) /* send erpt */
ldx [%g6 + CONFIG_ERROR_SVCH], %g6 /* error service handle */
ld [%g6 + SVC_CTRL_STATE], %g5
andn %g5, SVC_FLAGS_RI, %g5
st %g5, [%g6 + SVC_CTRL_STATE] ! clear RECV pending
UNLOCK(%g6, SVC_CTRL_LOCK)
ldx [%g6 + CONFIG_SVCS], %g6 ! svc root
UNLOCK(%g6, HV_SVC_DATA_LOCK)
CPU_POP(%g4, %g1, %g2, %g3)
st %g0, [%g4] /* flag as no need to send */
CPU_POP(%g7, %g1, %g2, %g3) /* restore callers return */
* SRAM is busy, flag so it gets sent later
* %g6 still contains the ROOT
CPU_POP(%g4, %g1, %g2, %g3)
st %g3, [%g4] /* flag pkt */
add %g6, CONFIG_ERRS_TO_SEND, %g6
CPU_POP(%g7, %g1, %g2, %g3) /* restore callers return */
CPU_POP(%g4, %g1, %g2, %g3) /* pop unsent flag ptr */
CPU_POP(%g7, %g1, %g2, %g3) /* restore callers return */
#else /* !(CONFIG_FPGA && CONFIG_SVC) */
#endif /* CONFIG_FPGA && CONFIG_SVC */
SET_SIZE(send_diag_erpt_nolock)