interrupt.s revision 5cd376e8b7030707d78315f63adb4bb2b4d9963e
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* All Rights Reserved */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Copyright (c) 1987, 1988 Microsoft Corporation */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* All Rights Reserved */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/asm_linkage.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/asm_misc.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/regset.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/psw.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/x86_archext.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if defined(__lint)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/types.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/thread.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/systm.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#else /* __lint */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/segments.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/pcb.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/trap.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ftrace.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/traptrace.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/clock.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/panic.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "assym.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* lint */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if defined(__lint)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_interrupt(void)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#else /* __lint */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if defined(__amd64)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common register usage:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * %r12 trap trace pointer
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ENTRY_NP2(cmnint, _interrupt)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor INTR_PUSH
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor INTGATE_INIT_KERNEL_FLAGS /* (set kernel rflags values) */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * At the end of TRACE_PTR %r12 points to the current TRAPTRACE entry
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TRACE_PTR(%r12, %rax, %eax, %rdx, $TT_INTERRUPT)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Uses labels 8 and 9 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TRACE_REGS(%r12, %rsp, %rax, %rbx) /* Uses label 9 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TRACE_STAMP(%r12) /* Clobbers %eax, %edx, uses 9 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movq %rsp, %rbp
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TRACE_STACK(%r12)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef TRAPTRACE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor LOADCPU(%rbx) /* &cpu */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movl CPU_PRI(%rbx), %r14d /* old ipl */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movl $255, TTR_IPL(%r12)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movl %r14d, %edi
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movb %dil, TTR_PRI(%r12)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movl CPU_BASE_SPL(%rbx), %edi
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movb %dil, TTR_SPL(%r12)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movb $255, TTR_VECTOR(%r12)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movq %r12, %rsi /* pass traptrace record pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movq %rsp, %rdi /* pass struct regs pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor call *do_interrupt_common
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor jmp _sys_rtt_ints_disabled
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*NOTREACHED*/
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SET_SIZE(cmnint)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SET_SIZE(_interrupt)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#elif defined(__i386)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ENTRY_NP2(cmnint, _interrupt)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor INTR_PUSH
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor INTGATE_INIT_KERNEL_FLAGS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * At the end of TRACE_PTR %esi points to the current TRAPTRACE entry
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TRACE_PTR(%esi, %eax, %eax, %edx, $TT_INTERRUPT)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Uses labels 8 and 9 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TRACE_REGS(%esi, %esp, %eax, %ebx) /* Uses label 9 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TRACE_STAMP(%esi) /* Clobbers %eax, %edx, uses 9 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movl %esp, %ebp
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TRACE_STACK(%esi)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushl %esi /* pass traptrace record pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushl %ebp /* pass struct regs pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor call *do_interrupt_common /* interrupt service routine */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor addl $8, %esp /* pop args off of stack */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor jmp _sys_rtt_ints_disabled
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*NOTREACHED*/
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SET_SIZE(cmnint)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SET_SIZE(_interrupt)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* __i386 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Declare a uintptr_t which has the size of _interrupt to enable stack
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * traceback code to know when a regs structure is on the stack.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor .globl _interrupt_size
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor .align CLONGSIZE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_interrupt_size:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor .NWORD . - _interrupt
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor .type _interrupt_size, @object
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* __lint */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if defined(__lint)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorfakesoftint(void)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#else /* __lint */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor / If we're here, we're being called from splx() to fake a soft
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor / interrupt (note that interrupts are still disabled from splx()).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor / We execute this code when a soft interrupt is posted at
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor / level higher than the CPU's current spl; when spl is lowered in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor / splx(), it will see the softint and jump here. We'll do exactly
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor / what a trap would do: push our flags, %cs, %eip, error code
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor / and trap number (T_SOFTINT). The cmnint() code will see T_SOFTINT
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor / and branch to the dosoftint() code.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if defined(__amd64)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * In 64-bit mode, iretq -always- pops all five regs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Imitate the 16-byte auto-align of the stack, and the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * zero-ed out %ss value.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ENTRY_NP(fakesoftint)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor movq %rsp, %r11
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor andq $-16, %rsp
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushq $KDS_SEL /* %ss */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushq %r11 /* %rsp */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushf /* rflags */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if defined(__xpv)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor popq %r11
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor EVENT_MASK_TO_IE(%rdi, %r11)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushq %r11
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushq $KCS_SEL /* %cs */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor leaq fakesoftint_return(%rip), %r11
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushq %r11 /* %rip */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushq $0 /* err */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushq $T_SOFTINT /* trap */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor jmp cmnint
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ALTENTRY(fakesoftint_return)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ret
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SET_SIZE(fakesoftint_return)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SET_SIZE(fakesoftint)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#elif defined(__i386)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ENTRY_NP(fakesoftint)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushfl
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if defined(__xpv)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor popl %eax
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor EVENT_MASK_TO_IE(%edx, %eax)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushl %eax
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushl %cs
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushl $fakesoftint_return
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushl $0
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pushl $T_SOFTINT
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor jmp cmnint
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ALTENTRY(fakesoftint_return)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ret
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SET_SIZE(fakesoftint_return)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor SET_SIZE(fakesoftint)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* __i386 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* __lint */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor