Home | History | Annotate | Line # | Download | only in prekern
      1 /*	$NetBSD: trap.S,v 1.6 2020/05/23 08:25:32 maxv Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2017-2020 The NetBSD Foundation, Inc. All rights reserved.
      5  *
      6  * This code is derived from software contributed to The NetBSD Foundation
      7  * by Maxime Villard.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     20  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     28  * POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #define _KERNEL
     32 
     33 /* Override user-land alignment before including asm.h */
     34 #define	ALIGN_DATA	.align	8
     35 #define ALIGN_TEXT	.align 16,0x90
     36 #define _ALIGN_TEXT	ALIGN_TEXT
     37 
     38 #include <machine/asm.h>
     39 
     40 #include <machine/trap.h>
     41 
     42 #define	TRAPENTRY(a) \
     43 	pushq $(a); \
     44 	jmp _C_LABEL(alltraps);
     45 
     46 #define	ZTRAPENTRY(a) \
     47 	pushq $0; \
     48 	pushq $(a); \
     49 	jmp _C_LABEL(alltraps);
     50 
     51 	.text
     52 
     53 IDTVEC(trap00)
     54 	ZTRAPENTRY(T_DIVIDE)
     55 IDTVEC_END(trap00)
     56 
     57 IDTVEC(trap01)
     58 	ZTRAPENTRY(T_TRCTRAP)
     59 IDTVEC_END(trap01)
     60 
     61 IDTVEC(trap02)
     62 	ZTRAPENTRY(T_NMI)
     63 IDTVEC_END(trap02)
     64 
     65 IDTVEC(trap03)
     66 	ZTRAPENTRY(T_BPTFLT)
     67 IDTVEC_END(trap03)
     68 
     69 IDTVEC(trap04)
     70 	ZTRAPENTRY(T_OFLOW)
     71 IDTVEC_END(trap04)
     72 
     73 IDTVEC(trap05)
     74 	ZTRAPENTRY(T_BOUND)
     75 IDTVEC_END(trap05)
     76 
     77 IDTVEC(trap06)
     78 	ZTRAPENTRY(T_PRIVINFLT)
     79 IDTVEC_END(trap06)
     80 
     81 IDTVEC(trap07)
     82 	ZTRAPENTRY(T_DNA)
     83 IDTVEC_END(trap07)
     84 
     85 IDTVEC(trap08)
     86 	TRAPENTRY(T_DOUBLEFLT)
     87 IDTVEC_END(trap08)
     88 
     89 IDTVEC(trap09)
     90 	ZTRAPENTRY(T_FPOPFLT)
     91 IDTVEC_END(trap09)
     92 
     93 IDTVEC(trap10)
     94 	TRAPENTRY(T_TSSFLT)
     95 IDTVEC_END(trap10)
     96 
     97 IDTVEC(trap11)
     98 	TRAPENTRY(T_SEGNPFLT)
     99 IDTVEC_END(trap11)
    100 
    101 IDTVEC(trap12)
    102 	TRAPENTRY(T_STKFLT)
    103 IDTVEC_END(trap12)
    104 
    105 IDTVEC(trap13)
    106 	TRAPENTRY(T_PROTFLT)
    107 IDTVEC_END(trap13)
    108 
    109 IDTVEC(trap14)
    110 	TRAPENTRY(T_PAGEFLT)
    111 IDTVEC_END(trap14)
    112 
    113 IDTVEC(trap15)
    114 	ZTRAPENTRY(T_ASTFLT)
    115 IDTVEC_END(trap15)
    116 
    117 IDTVEC(trap16)
    118 	ZTRAPENTRY(T_ARITHTRAP)
    119 IDTVEC_END(trap16)
    120 
    121 IDTVEC(trap17)
    122 	TRAPENTRY(T_ALIGNFLT)
    123 IDTVEC_END(trap17)
    124 
    125 IDTVEC(trap18)
    126 	ZTRAPENTRY(T_MCA)
    127 IDTVEC_END(trap18)
    128 
    129 IDTVEC(trap19)
    130 	ZTRAPENTRY(T_XMM)
    131 IDTVEC_END(trap19)
    132 
    133 IDTVEC(trap20)
    134 IDTVEC(trap21)
    135 IDTVEC(trap22)
    136 IDTVEC(trap23)
    137 IDTVEC(trap24)
    138 IDTVEC(trap25)
    139 IDTVEC(trap26)
    140 IDTVEC(trap27)
    141 IDTVEC(trap28)
    142 IDTVEC(trap29)
    143 IDTVEC(trap30)
    144 IDTVEC(trap31)
    145 	/* 20 - 31 reserved for future exp */
    146 	ZTRAPENTRY(T_RESERVED)
    147 IDTVEC_END(trap31)
    148 IDTVEC_END(trap30)
    149 IDTVEC_END(trap29)
    150 IDTVEC_END(trap28)
    151 IDTVEC_END(trap27)
    152 IDTVEC_END(trap26)
    153 IDTVEC_END(trap25)
    154 IDTVEC_END(trap24)
    155 IDTVEC_END(trap23)
    156 IDTVEC_END(trap22)
    157 IDTVEC_END(trap21)
    158 IDTVEC_END(trap20)
    159 
    160 /*
    161  * Arguments pushed on the stack:
    162  *  sf_trapno
    163  *  sf_err  (dummy inserted if not defined)
    164  *  sf_rip
    165  *  sf_cs
    166  *  sf_rflags
    167  *  sf_rsp
    168  *  sf_ss
    169  */
    170 ENTRY(alltraps)
    171 	movq	%rsp,%rdi
    172 	call	_C_LABEL(trap)
    173 	/* NOTREACHED */
    174 END(alltraps)
    175 
    176 	.section .rodata
    177 
    178 LABEL(x86_exceptions)
    179 	.quad	_C_LABEL(Xtrap00), _C_LABEL(Xtrap01)
    180 	.quad	_C_LABEL(Xtrap02), _C_LABEL(Xtrap03)
    181 	.quad	_C_LABEL(Xtrap04), _C_LABEL(Xtrap05)
    182 	.quad	_C_LABEL(Xtrap06), _C_LABEL(Xtrap07)
    183 	.quad	_C_LABEL(Xtrap08), _C_LABEL(Xtrap09)
    184 	.quad	_C_LABEL(Xtrap10), _C_LABEL(Xtrap11)
    185 	.quad	_C_LABEL(Xtrap12), _C_LABEL(Xtrap13)
    186 	.quad	_C_LABEL(Xtrap14), _C_LABEL(Xtrap15)
    187 	.quad	_C_LABEL(Xtrap16), _C_LABEL(Xtrap17)
    188 	.quad	_C_LABEL(Xtrap18), _C_LABEL(Xtrap19)
    189 	.quad	_C_LABEL(Xtrap20), _C_LABEL(Xtrap21)
    190 	.quad	_C_LABEL(Xtrap22), _C_LABEL(Xtrap23)
    191 	.quad	_C_LABEL(Xtrap24), _C_LABEL(Xtrap25)
    192 	.quad	_C_LABEL(Xtrap26), _C_LABEL(Xtrap27)
    193 	.quad	_C_LABEL(Xtrap28), _C_LABEL(Xtrap29)
    194 	.quad	_C_LABEL(Xtrap30), _C_LABEL(Xtrap31)
    195 END(x86_exceptions)
    196