1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #pragma ident   "%Z%%M% %I%     %E% SMI"
  27 
  28 /*
  29  * Companion to kdi_idt.c - the implementation of the trap and interrupt
  30  * handlers.  For the most part, these handlers do the same thing - they
  31  * push a trap number onto the stack, followed by a jump to kdi_cmnint.
  32  * Each trap and interrupt has its own handler because each one pushes a
  33  * different number.
  34  */
  35 
  36 #include <sys/asm_linkage.h>
  37 #include <sys/kdi_regs.h>
  38 
  39 /* Nothing in this file is of interest to lint. */
  40 #if !defined(__lint)
  41 
  42 /* 
  43  * The default ASM_ENTRY_ALIGN (16) wastes far too much space.  Pay no
  44  * attention to the fleet of nop's we're adding to each handler.
  45  */
  46 #undef  ASM_ENTRY_ALIGN
  47 #define ASM_ENTRY_ALIGN 8
  48 
  49 /*
  50  * We need the .align in ENTRY_NP (defined to be ASM_ENTRY_ALIGN) to match our
  51  * manual .align (KDI_MSR_PATCHOFF) in order to ensure that the space reserved
  52  * at the beginning of the handler for code is exactly KDI_MSR_PATCHOFF bytes
  53  * long.  Note that the #error below isn't supported by the preprocessor invoked
  54  * by as(1), and won't stop the build, but it'll emit a noticeable error message
  55  * which won't escape the filters.
  56  */
  57 #if ASM_ENTRY_ALIGN != KDI_MSR_PATCHOFF
  58 #error "ASM_ENTRY_ALIGN != KDI_MSR_PATCHOFF"
  59 this won't assemble
  60 #endif
  61 
  62 /*
  63  * kdi_idt_patch will, on certain processors, replace the patch points below
  64  * with MSR-clearing code.  kdi_id_patch has intimate knowledge of the size of
  65  * the nop hole, as well as the structure of the handlers.  Do not change
  66  * anything here without also changing kdi_idt_patch.
  67  */
  68 
  69 /*
  70  * Generic trap and interrupt handlers.
  71  */
  72 
  73 #if defined(__xpv) && defined(__amd64)
  74 
  75 /*
  76  * The hypervisor places r11 and rcx on the stack.
  77  */
  78 
  79 #define TRAP_NOERR(trapno) \
  80         popq    %rcx;           \
  81         popq    %r11;           \
  82         pushq   $trapno
  83 
  84 #define TRAP_ERR(trapno)        \
  85         popq    %rcx;           \
  86         popq    %r11;           \
  87         pushq   $0;             \
  88         pushq   $trapno
  89 
  90 #else
  91 
  92 #define TRAP_NOERR(trapno)      \
  93         push    $trapno
  94 
  95 #define TRAP_ERR(trapno)        \
  96         push    $0;             \
  97         push    $trapno
  98 
  99 #endif  /* __xpv && __amd64 */
 100 
 101 
 102 #define MKIVCT(n) \
 103         ENTRY_NP(kdi_ivct/**/n/**/);    \
 104         TRAP_ERR(n);                    \
 105         .align  KDI_MSR_PATCHOFF;       \
 106         KDI_MSR_PATCH;                  \
 107         jmp     kdi_cmnint;             \
 108         SET_SIZE(kdi_ivct/**/n/**/)
 109 
 110 #define MKTRAPHDLR(n) \
 111         ENTRY_NP(kdi_trap/**/n);        \
 112         TRAP_ERR(n);                    \
 113         .align  KDI_MSR_PATCHOFF;       \
 114         KDI_MSR_PATCH;                  \
 115         jmp     kdi_cmnint;             \
 116         SET_SIZE(kdi_trap/**/n/**/)
 117 
 118 #define MKTRAPERRHDLR(n) \
 119         ENTRY_NP(kdi_traperr/**/n);     \
 120         TRAP_NOERR(n);                  \
 121         .align  KDI_MSR_PATCHOFF;       \
 122         KDI_MSR_PATCH;                  \
 123         jmp     kdi_cmnint;             \
 124         SET_SIZE(kdi_traperr/**/n)
 125 
 126 #define MKNMIHDLR \
 127         ENTRY_NP(kdi_int2);             \
 128         TRAP_NOERR(2);                  \
 129         .align  KDI_MSR_PATCHOFF;       \
 130         KDI_MSR_PATCH;                  \
 131         jmp     kdi_nmiint;             \
 132         SET_SIZE(kdi_int2)
 133 
 134 #define MKINVALHDLR \
 135         ENTRY_NP(kdi_invaltrap);        \
 136         TRAP_NOERR(255);                \
 137         .align  KDI_MSR_PATCHOFF;       \
 138         KDI_MSR_PATCH;                  \
 139         jmp     kdi_cmnint;             \
 140         SET_SIZE(kdi_invaltrap)
 141 
 142 /*
 143  * The handlers themselves
 144  */
 145 
 146         MKINVALHDLR
 147         MKTRAPHDLR(0)
 148         MKTRAPHDLR(1)
 149         MKNMIHDLR/*2*/
 150         MKTRAPHDLR(3)
 151         MKTRAPHDLR(4)
 152         MKTRAPHDLR(5)
 153         MKTRAPHDLR(6)
 154         MKTRAPHDLR(7)
 155         MKTRAPHDLR(9)
 156         MKTRAPHDLR(15)
 157         MKTRAPHDLR(16)
 158         MKTRAPHDLR(17)
 159         MKTRAPHDLR(18)
 160         MKTRAPHDLR(19)
 161         MKTRAPHDLR(20)
 162 
 163         MKTRAPERRHDLR(8)
 164         MKTRAPERRHDLR(10)
 165         MKTRAPERRHDLR(11)
 166         MKTRAPERRHDLR(12)
 167         MKTRAPERRHDLR(13)
 168         MKTRAPERRHDLR(14)
 169 
 170         .globl  kdi_ivct_size
 171 kdi_ivct_size:
 172         .NWORD [kdi_ivct33-kdi_ivct32]
 173         
 174         /* 10 billion and one interrupt handlers */
 175 kdi_ivct_base:
 176         MKIVCT(32);     MKIVCT(33);     MKIVCT(34);     MKIVCT(35);
 177         MKIVCT(36);     MKIVCT(37);     MKIVCT(38);     MKIVCT(39);
 178         MKIVCT(40);     MKIVCT(41);     MKIVCT(42);     MKIVCT(43);
 179         MKIVCT(44);     MKIVCT(45);     MKIVCT(46);     MKIVCT(47);
 180         MKIVCT(48);     MKIVCT(49);     MKIVCT(50);     MKIVCT(51);
 181         MKIVCT(52);     MKIVCT(53);     MKIVCT(54);     MKIVCT(55);
 182         MKIVCT(56);     MKIVCT(57);     MKIVCT(58);     MKIVCT(59);
 183         MKIVCT(60);     MKIVCT(61);     MKIVCT(62);     MKIVCT(63);
 184         MKIVCT(64);     MKIVCT(65);     MKIVCT(66);     MKIVCT(67);
 185         MKIVCT(68);     MKIVCT(69);     MKIVCT(70);     MKIVCT(71);
 186         MKIVCT(72);     MKIVCT(73);     MKIVCT(74);     MKIVCT(75);
 187         MKIVCT(76);     MKIVCT(77);     MKIVCT(78);     MKIVCT(79);
 188         MKIVCT(80);     MKIVCT(81);     MKIVCT(82);     MKIVCT(83);
 189         MKIVCT(84);     MKIVCT(85);     MKIVCT(86);     MKIVCT(87);
 190         MKIVCT(88);     MKIVCT(89);     MKIVCT(90);     MKIVCT(91);
 191         MKIVCT(92);     MKIVCT(93);     MKIVCT(94);     MKIVCT(95);
 192         MKIVCT(96);     MKIVCT(97);     MKIVCT(98);     MKIVCT(99);
 193         MKIVCT(100);    MKIVCT(101);    MKIVCT(102);    MKIVCT(103);
 194         MKIVCT(104);    MKIVCT(105);    MKIVCT(106);    MKIVCT(107);
 195         MKIVCT(108);    MKIVCT(109);    MKIVCT(110);    MKIVCT(111);
 196         MKIVCT(112);    MKIVCT(113);    MKIVCT(114);    MKIVCT(115);
 197         MKIVCT(116);    MKIVCT(117);    MKIVCT(118);    MKIVCT(119);
 198         MKIVCT(120);    MKIVCT(121);    MKIVCT(122);    MKIVCT(123);
 199         MKIVCT(124);    MKIVCT(125);    MKIVCT(126);    MKIVCT(127);
 200         MKIVCT(128);    MKIVCT(129);    MKIVCT(130);    MKIVCT(131);
 201         MKIVCT(132);    MKIVCT(133);    MKIVCT(134);    MKIVCT(135);
 202         MKIVCT(136);    MKIVCT(137);    MKIVCT(138);    MKIVCT(139);
 203         MKIVCT(140);    MKIVCT(141);    MKIVCT(142);    MKIVCT(143);
 204         MKIVCT(144);    MKIVCT(145);    MKIVCT(146);    MKIVCT(147);
 205         MKIVCT(148);    MKIVCT(149);    MKIVCT(150);    MKIVCT(151);
 206         MKIVCT(152);    MKIVCT(153);    MKIVCT(154);    MKIVCT(155);
 207         MKIVCT(156);    MKIVCT(157);    MKIVCT(158);    MKIVCT(159);
 208         MKIVCT(160);    MKIVCT(161);    MKIVCT(162);    MKIVCT(163);
 209         MKIVCT(164);    MKIVCT(165);    MKIVCT(166);    MKIVCT(167);
 210         MKIVCT(168);    MKIVCT(169);    MKIVCT(170);    MKIVCT(171);
 211         MKIVCT(172);    MKIVCT(173);    MKIVCT(174);    MKIVCT(175);
 212         MKIVCT(176);    MKIVCT(177);    MKIVCT(178);    MKIVCT(179);
 213         MKIVCT(180);    MKIVCT(181);    MKIVCT(182);    MKIVCT(183);
 214         MKIVCT(184);    MKIVCT(185);    MKIVCT(186);    MKIVCT(187);
 215         MKIVCT(188);    MKIVCT(189);    MKIVCT(190);    MKIVCT(191);
 216         MKIVCT(192);    MKIVCT(193);    MKIVCT(194);    MKIVCT(195);
 217         MKIVCT(196);    MKIVCT(197);    MKIVCT(198);    MKIVCT(199);
 218         MKIVCT(200);    MKIVCT(201);    MKIVCT(202);    MKIVCT(203);
 219         MKIVCT(204);    MKIVCT(205);    MKIVCT(206);    MKIVCT(207);
 220         MKIVCT(208);    MKIVCT(209);    MKIVCT(210);    MKIVCT(211);
 221         MKIVCT(212);    MKIVCT(213);    MKIVCT(214);    MKIVCT(215);
 222         MKIVCT(216);    MKIVCT(217);    MKIVCT(218);    MKIVCT(219);
 223         MKIVCT(220);    MKIVCT(221);    MKIVCT(222);    MKIVCT(223);
 224         MKIVCT(224);    MKIVCT(225);    MKIVCT(226);    MKIVCT(227);
 225         MKIVCT(228);    MKIVCT(229);    MKIVCT(230);    MKIVCT(231);
 226         MKIVCT(232);    MKIVCT(233);    MKIVCT(234);    MKIVCT(235);
 227         MKIVCT(236);    MKIVCT(237);    MKIVCT(238);    MKIVCT(239);
 228         MKIVCT(240);    MKIVCT(241);    MKIVCT(242);    MKIVCT(243);
 229         MKIVCT(244);    MKIVCT(245);    MKIVCT(246);    MKIVCT(247);
 230         MKIVCT(248);    MKIVCT(249);    MKIVCT(250);    MKIVCT(251);
 231         MKIVCT(252);    MKIVCT(253);    MKIVCT(254);    MKIVCT(255);
 232 
 233 #endif