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