root/sys/arch/alpha/alpha/debug.s
/* $OpenBSD: debug.s,v 1.9 2015/06/27 10:51:46 dlg Exp $ */
/* $NetBSD: debug.s,v 1.5 1999/06/18 18:11:56 thorpej Exp $ */

/*-
 * Copyright (c) 1999 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
 * NASA Ames Research Center.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions 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.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#if defined (MULTIPROCESSOR)
.file   5 __FILE__
.loc    5 __LINE__
#else
.file   4 __FILE__
.loc    4 __LINE__
#endif

/*
 * Debugger glue.
 */

        .text

/*
 * Debugger stack.
 */
#define DEBUG_STACK_SIZE        8192
BSS(debug_stack_bottom, DEBUG_STACK_SIZE)

#define debug_stack_top (debug_stack_bottom + DEBUG_STACK_SIZE)

/*
 * alpha_debug:
 *
 *      Single debugger entry point, handling the housekeeping
 *      chores we need to deal with.
 *
 *      Arguments are:
 *
 *              a0      a0 from trap
 *              a1      a1 from trap
 *              a2      a2 from trap
 *              a3      kernel trap entry point
 *              a4      frame pointer
 */
NESTED_NOPROFILE(alpha_debug, 5, 32, ra, IM_RA|IM_S0, 0)
        br      pv, 1f
1:      LDGP(pv)
        lda     t0, FRAME_SIZE*8(a4)    /* what would sp have been? */
        stq     t0, FRAME_SP*8(a4)      /* belatedly save sp for ddb view */
        lda     sp, -32(sp)             /* set up stack frame */
        stq     ra, (32-8)(sp)          /* save ra */
        stq     s0, (32-16)(sp)         /* save s0 */

        /* Remember our current stack pointer. */
        mov     sp, s0

#if defined(MULTIPROCESSOR)
        /* Pause all other CPUs. */
        ldiq    a0, 1
        CALL(cpu_pause_resume_all)
#endif

        /*
         * Switch to the debug stack if we're not on it already.
         */
        lda     t0, debug_stack_bottom
        cmpule  sp, t0, t1              /* sp <= debug_stack_bottom */
        bne     t1, 2f                  /* yes, switch now */

        lda     t0, debug_stack_top
        cmpule  t0, sp, t1              /* debug_stack_top <= sp? */
        bne     t1, 3f                  /* yes, we're on the debug stack */

2:      lda     sp, debug_stack_top     /* sp <- debug_stack_top */

3:      /* Dispatch to the debugger - arguments are already in place. */
        CALL(ddb_trap)

        /* Debugger return value in v0; switch back to our previous stack. */
        mov     s0, sp

#if defined(MULTIPROCESSOR)
        mov     v0, s0

        /* Resume all other CPUs. */
        mov     zero, a0
        CALL(cpu_pause_resume_all)

        mov     s0, v0
#endif

        ldq     ra, (32-8)(sp)          /* restore ra */
        ldq     s0, (32-16)(sp)         /* restore s0 */
        lda     sp, 32(sp)              /* pop stack frame */
        RET
        END(alpha_debug)

#if defined(MULTIPROCESSOR) && defined(MP_LOCKDEBUG)
NESTED(alpha_ipi_process_with_frame, 2, 8 * FRAME_SIZE, ra, IM_RA, 0)
        .set noat
        lda     sp, -(8 * FRAME_SIZE)(sp)               /* set up stack frame */

        stq     v0,(FRAME_V0*8)(sp)
        stq     t0,(FRAME_T0*8)(sp)
        stq     t1,(FRAME_T1*8)(sp)
        stq     t2,(FRAME_T2*8)(sp)
        stq     t3,(FRAME_T3*8)(sp)
        stq     t4,(FRAME_T4*8)(sp)
        stq     t5,(FRAME_T5*8)(sp)
        stq     t6,(FRAME_T6*8)(sp)
        stq     t7,(FRAME_T7*8)(sp)
        stq     s0,(FRAME_S0*8)(sp)
        stq     s1,(FRAME_S1*8)(sp)
        stq     s2,(FRAME_S2*8)(sp)
        stq     s3,(FRAME_S3*8)(sp)
        stq     s4,(FRAME_S4*8)(sp)
        stq     s5,(FRAME_S5*8)(sp)
        stq     s6,(FRAME_S6*8)(sp)
        stq     a3,(FRAME_A3*8)(sp)
        stq     a4,(FRAME_A4*8)(sp)
        stq     a5,(FRAME_A5*8)(sp)
        stq     t8,(FRAME_T8*8)(sp)
        stq     t9,(FRAME_T9*8)(sp)
        stq     t10,(FRAME_T10*8)(sp)
        stq     t11,(FRAME_T11*8)(sp)
        stq     ra,(FRAME_RA*8)(sp)
        stq     t12,(FRAME_T12*8)(sp)
        stq     at_reg,(FRAME_AT*8)(sp)
        lda     a1,(8*FRAME_SIZE)(sp)
        stq     a1,(FRAME_SP*8)(sp)

        stq     zero,(FRAME_PS*8)(sp)
        stq     zero,(FRAME_PC*8)(sp)
        stq     zero,(FRAME_GP*8)(sp)
        stq     zero,(FRAME_A0*8)(sp)
        stq     zero,(FRAME_A1*8)(sp)
        stq     zero,(FRAME_A2*8)(sp)

        mov     sp, a1
        CALL(alpha_ipi_process)

        ldq     ra,(FRAME_RA*8)(sp)
        lda     sp, (8 * FRAME_SIZE)(sp)                /* pop stack frame */
        RET
        END(alpha_ipi_process_with_frame)
        .set at
#endif