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 53IDTVEC(trap00) 54 ZTRAPENTRY(T_DIVIDE) 55IDTVEC_END(trap00) 56 57IDTVEC(trap01) 58 ZTRAPENTRY(T_TRCTRAP) 59IDTVEC_END(trap01) 60 61IDTVEC(trap02) 62 ZTRAPENTRY(T_NMI) 63IDTVEC_END(trap02) 64 65IDTVEC(trap03) 66 ZTRAPENTRY(T_BPTFLT) 67IDTVEC_END(trap03) 68 69IDTVEC(trap04) 70 ZTRAPENTRY(T_OFLOW) 71IDTVEC_END(trap04) 72 73IDTVEC(trap05) 74 ZTRAPENTRY(T_BOUND) 75IDTVEC_END(trap05) 76 77IDTVEC(trap06) 78 ZTRAPENTRY(T_PRIVINFLT) 79IDTVEC_END(trap06) 80 81IDTVEC(trap07) 82 ZTRAPENTRY(T_DNA) 83IDTVEC_END(trap07) 84 85IDTVEC(trap08) 86 TRAPENTRY(T_DOUBLEFLT) 87IDTVEC_END(trap08) 88 89IDTVEC(trap09) 90 ZTRAPENTRY(T_FPOPFLT) 91IDTVEC_END(trap09) 92 93IDTVEC(trap10) 94 TRAPENTRY(T_TSSFLT) 95IDTVEC_END(trap10) 96 97IDTVEC(trap11) 98 TRAPENTRY(T_SEGNPFLT) 99IDTVEC_END(trap11) 100 101IDTVEC(trap12) 102 TRAPENTRY(T_STKFLT) 103IDTVEC_END(trap12) 104 105IDTVEC(trap13) 106 TRAPENTRY(T_PROTFLT) 107IDTVEC_END(trap13) 108 109IDTVEC(trap14) 110 TRAPENTRY(T_PAGEFLT) 111IDTVEC_END(trap14) 112 113IDTVEC(trap15) 114 ZTRAPENTRY(T_ASTFLT) 115IDTVEC_END(trap15) 116 117IDTVEC(trap16) 118 ZTRAPENTRY(T_ARITHTRAP) 119IDTVEC_END(trap16) 120 121IDTVEC(trap17) 122 TRAPENTRY(T_ALIGNFLT) 123IDTVEC_END(trap17) 124 125IDTVEC(trap18) 126 ZTRAPENTRY(T_MCA) 127IDTVEC_END(trap18) 128 129IDTVEC(trap19) 130 ZTRAPENTRY(T_XMM) 131IDTVEC_END(trap19) 132 133IDTVEC(trap20) 134IDTVEC(trap21) 135IDTVEC(trap22) 136IDTVEC(trap23) 137IDTVEC(trap24) 138IDTVEC(trap25) 139IDTVEC(trap26) 140IDTVEC(trap27) 141IDTVEC(trap28) 142IDTVEC(trap29) 143IDTVEC(trap30) 144IDTVEC(trap31) 145 /* 20 - 31 reserved for future exp */ 146 ZTRAPENTRY(T_RESERVED) 147IDTVEC_END(trap31) 148IDTVEC_END(trap30) 149IDTVEC_END(trap29) 150IDTVEC_END(trap28) 151IDTVEC_END(trap27) 152IDTVEC_END(trap26) 153IDTVEC_END(trap25) 154IDTVEC_END(trap24) 155IDTVEC_END(trap23) 156IDTVEC_END(trap22) 157IDTVEC_END(trap21) 158IDTVEC_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 */ 170ENTRY(alltraps) 171 movq %rsp,%rdi 172 call _C_LABEL(trap) 173 /* NOTREACHED */ 174END(alltraps) 175 176 .section .rodata 177 178LABEL(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) 195END(x86_exceptions) 196