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 /*
  23  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  *
  26  * Copyright 2018 Joyent, Inc.
  27  */
  28 
  29 /*
  30  * Debugger entry for both master and slave CPUs
  31  */
  32 
  33 #if defined(__lint)
  34 #include <sys/types.h>
  35 #endif
  36 
  37 #include <sys/segments.h>
  38 #include <sys/asm_linkage.h>
  39 #include <sys/controlregs.h>
  40 #include <sys/x86_archext.h>
  41 #include <sys/privregs.h>
  42 #include <sys/machprivregs.h>
  43 #include <sys/kdi_regs.h>
  44 #include <sys/psw.h>
  45 #include <sys/uadmin.h>
  46 #ifdef __xpv
  47 #include <sys/hypervisor.h>
  48 #endif
  49 
  50 #ifdef _ASM
  51 
  52 #include <kdi_assym.h>
  53 #include <assym.h>
  54 
  55 /* clobbers %rdx, %rcx, returns addr in %rax, CPU ID in %rbx */
  56 #define GET_CPUSAVE_ADDR \
  57         movzbq  %gs:CPU_ID, %rbx;               \
  58         movq    %rbx, %rax;                     \
  59         movq    $KRS_SIZE, %rcx;                \
  60         mulq    %rcx;                           \
  61         movq    $kdi_cpusave, %rdx;             \
  62         /*CSTYLED*/                             \
  63         addq    (%rdx), %rax
  64 
  65 /*
  66  * Save copies of the IDT and GDT descriptors.  Note that we only save the IDT
  67  * and GDT if the IDT isn't ours, as we may be legitimately re-entering the
  68  * debugger through the trap handler.  We don't want to clobber the saved IDT
  69  * in the process, as we'd end up resuming the world on our IDT.
  70  */
  71 #define SAVE_IDTGDT                             \
  72         movq    %gs:CPU_IDT, %r11;              \
  73         leaq    kdi_idt(%rip), %rsi;            \
  74         cmpq    %rsi, %r11;                     \
  75         je      1f;                             \
  76         movq    %r11, KRS_IDT(%rax);            \
  77         movq    %gs:CPU_GDT, %r11;              \
  78         movq    %r11, KRS_GDT(%rax);            \
  79 1:
  80 
  81 #ifdef __xpv
  82 
  83 #define SAVE_GSBASE(reg) /* nothing */
  84 #define RESTORE_GSBASE(reg) /* nothing */
  85 
  86 #else
  87 
  88 #define SAVE_GSBASE(base)                               \
  89         movl    $MSR_AMD_GSBASE, %ecx;                  \
  90         rdmsr;                                          \
  91         shlq    $32, %rdx;                              \
  92         orq     %rax, %rdx;                             \
  93         movq    %rdx, REG_OFF(KDIREG_GSBASE)(base)
  94 
  95 #define RESTORE_GSBASE(base)                            \
  96         movq    REG_OFF(KDIREG_GSBASE)(base), %rdx;     \
  97         movq    %rdx, %rax;                             \
  98         shrq    $32, %rdx;                              \
  99         movl    $MSR_AMD_GSBASE, %ecx;                  \
 100         wrmsr
 101 
 102 #endif /* __xpv */
 103 
 104 /*
 105  * %ss, %rsp, %rflags, %cs, %rip, %err, %trapno are already on the stack.  Note
 106  * that on the hypervisor, we skip the save/restore of GSBASE: it's slow, and
 107  * unnecessary.
 108  */
 109 #define KDI_SAVE_REGS(base) \
 110         movq    %rdi, REG_OFF(KDIREG_RDI)(base);        \
 111         movq    %rsi, REG_OFF(KDIREG_RSI)(base);        \
 112         movq    %rdx, REG_OFF(KDIREG_RDX)(base);        \
 113         movq    %rcx, REG_OFF(KDIREG_RCX)(base);        \
 114         movq    %r8, REG_OFF(KDIREG_R8)(base);          \
 115         movq    %r9, REG_OFF(KDIREG_R9)(base);          \
 116         movq    %rax, REG_OFF(KDIREG_RAX)(base);        \
 117         movq    %rbx, REG_OFF(KDIREG_RBX)(base);        \
 118         movq    %rbp, REG_OFF(KDIREG_RBP)(base);        \
 119         movq    %r10, REG_OFF(KDIREG_R10)(base);        \
 120         movq    %r11, REG_OFF(KDIREG_R11)(base);        \
 121         movq    %r12, REG_OFF(KDIREG_R12)(base);        \
 122         movq    %r13, REG_OFF(KDIREG_R13)(base);        \
 123         movq    %r14, REG_OFF(KDIREG_R14)(base);        \
 124         movq    %r15, REG_OFF(KDIREG_R15)(base);        \
 125         movq    %rbp, REG_OFF(KDIREG_SAVFP)(base);      \
 126         movq    REG_OFF(KDIREG_RIP)(base), %rax;        \
 127         movq    %rax, REG_OFF(KDIREG_SAVPC)(base);      \
 128         clrq    %rax;                                   \
 129         movw    %ds, %ax;                               \
 130         movq    %rax, REG_OFF(KDIREG_DS)(base);         \
 131         movw    %es, %ax;                               \
 132         movq    %rax, REG_OFF(KDIREG_ES)(base);         \
 133         movw    %fs, %ax;                               \
 134         movq    %rax, REG_OFF(KDIREG_FS)(base);         \
 135         movw    %gs, %ax;                               \
 136         movq    %rax, REG_OFF(KDIREG_GS)(base);         \
 137         SAVE_GSBASE(base)
 138 
 139 #define KDI_RESTORE_REGS(base) \
 140         movq    base, %rdi;                             \
 141         RESTORE_GSBASE(%rdi);                           \
 142         movq    REG_OFF(KDIREG_ES)(%rdi), %rax;         \
 143         movw    %ax, %es;                               \
 144         movq    REG_OFF(KDIREG_DS)(%rdi), %rax;         \
 145         movw    %ax, %ds;                               \
 146         movq    REG_OFF(KDIREG_R15)(%rdi), %r15;        \
 147         movq    REG_OFF(KDIREG_R14)(%rdi), %r14;        \
 148         movq    REG_OFF(KDIREG_R13)(%rdi), %r13;        \
 149         movq    REG_OFF(KDIREG_R12)(%rdi), %r12;        \
 150         movq    REG_OFF(KDIREG_R11)(%rdi), %r11;        \
 151         movq    REG_OFF(KDIREG_R10)(%rdi), %r10;        \
 152         movq    REG_OFF(KDIREG_RBP)(%rdi), %rbp;        \
 153         movq    REG_OFF(KDIREG_RBX)(%rdi), %rbx;        \
 154         movq    REG_OFF(KDIREG_RAX)(%rdi), %rax;        \
 155         movq    REG_OFF(KDIREG_R9)(%rdi), %r9;          \
 156         movq    REG_OFF(KDIREG_R8)(%rdi), %r8;          \
 157         movq    REG_OFF(KDIREG_RCX)(%rdi), %rcx;        \
 158         movq    REG_OFF(KDIREG_RDX)(%rdi), %rdx;        \
 159         movq    REG_OFF(KDIREG_RSI)(%rdi), %rsi;        \
 160         movq    REG_OFF(KDIREG_RDI)(%rdi), %rdi
 161 
 162 /*
 163  * Given the address of the current CPU's cpusave area in %rax, the following
 164  * macro restores the debugging state to said CPU.  Restored state includes
 165  * the debug registers from the global %dr variables.
 166  *
 167  * Takes the cpusave area in %rdi as a parameter.
 168  */
 169 #define KDI_RESTORE_DEBUGGING_STATE \
 170         pushq   %rdi;                                           \
 171         leaq    kdi_drreg(%rip), %r15;                          \
 172         movl    $7, %edi;                                       \
 173         movq    DR_CTL(%r15), %rsi;                             \
 174         call    kdi_dreg_set;                                   \
 175                                                                 \
 176         movl    $6, %edi;                                       \
 177         movq    $KDIREG_DRSTAT_RESERVED, %rsi;                  \
 178         call    kdi_dreg_set;                                   \
 179                                                                 \
 180         movl    $0, %edi;                                       \
 181         movq    DRADDR_OFF(0)(%r15), %rsi;                      \
 182         call    kdi_dreg_set;                                   \
 183         movl    $1, %edi;                                       \
 184         movq    DRADDR_OFF(1)(%r15), %rsi;                      \
 185         call    kdi_dreg_set;                                   \
 186         movl    $2, %edi;                                       \
 187         movq    DRADDR_OFF(2)(%r15), %rsi;                      \
 188         call    kdi_dreg_set;                                   \
 189         movl    $3, %edi;                                       \
 190         movq    DRADDR_OFF(3)(%r15), %rsi;                      \
 191         call    kdi_dreg_set;                                   \
 192         popq    %rdi;
 193 
 194 /*
 195  * Each cpusave buffer has an area set aside for a ring buffer of breadcrumbs.
 196  * The following macros manage the buffer.
 197  */
 198 
 199 /* Advance the ring buffer */
 200 #define ADVANCE_CRUMB_POINTER(cpusave, tmp1, tmp2) \
 201         movq    KRS_CURCRUMBIDX(cpusave), tmp1; \
 202         cmpq    $[KDI_NCRUMBS - 1], tmp1;       \
 203         jge     1f;                             \
 204         /* Advance the pointer and index */     \
 205         addq    $1, tmp1;                       \
 206         movq    tmp1, KRS_CURCRUMBIDX(cpusave); \
 207         movq    KRS_CURCRUMB(cpusave), tmp1;    \
 208         addq    $KRM_SIZE, tmp1;                \
 209         jmp     2f;                             \
 210 1:      /* Reset the pointer and index */       \
 211         movq    $0, KRS_CURCRUMBIDX(cpusave);   \
 212         leaq    KRS_CRUMBS(cpusave), tmp1;      \
 213 2:      movq    tmp1, KRS_CURCRUMB(cpusave);    \
 214         /* Clear the new crumb */               \
 215         movq    $KDI_NCRUMBS, tmp2;             \
 216 3:      movq    $0, -4(tmp1, tmp2, 4);          \
 217         decq    tmp2;                           \
 218         jnz     3b
 219 
 220 /* Set a value in the current breadcrumb buffer */
 221 #define ADD_CRUMB(cpusave, offset, value, tmp) \
 222         movq    KRS_CURCRUMB(cpusave), tmp;     \
 223         movq    value, offset(tmp)
 224 
 225 #endif  /* _ASM */
 226 
 227 #if defined(__lint)
 228 void
 229 kdi_cmnint(void)
 230 {
 231 }
 232 #else   /* __lint */
 233 
 234         /* XXX implement me */
 235         ENTRY_NP(kdi_nmiint)
 236         clrq    %rcx
 237         movq    (%rcx), %rcx
 238         SET_SIZE(kdi_nmiint)
 239 
 240         /*
 241          * The main entry point for master CPUs.  It also serves as the trap
 242          * handler for all traps and interrupts taken during single-step.
 243          */
 244         ENTRY_NP(kdi_cmnint)
 245         ALTENTRY(kdi_master_entry)
 246 
 247         pushq   %rax
 248         CLI(%rax)
 249         popq    %rax
 250 
 251         /* Save current register state */
 252         subq    $REG_OFF(KDIREG_TRAPNO), %rsp
 253         KDI_SAVE_REGS(%rsp)
 254 
 255 #ifdef __xpv
 256         /*
 257          * Clear saved_upcall_mask in unused byte of cs slot on stack.
 258          * It can only confuse things.
 259          */
 260         movb    $0, REG_OFF(KDIREG_CS)+4(%rsp)
 261 #endif
 262 
 263 #if !defined(__xpv)
 264         /*
 265          * Switch to the kernel's GSBASE.  Neither GSBASE nor the ill-named
 266          * KGSBASE can be trusted, as the kernel may or may not have already
 267          * done a swapgs.  All is not lost, as the kernel can divine the correct
 268          * value for us.  Note that the previous GSBASE is saved in the
 269          * KDI_SAVE_REGS macro to prevent a usermode process's GSBASE from being
 270          * blown away.  On the hypervisor, we don't need to do this, since it's
 271          * ensured we're on our requested kernel GSBASE already.
 272          */
 273         subq    $10, %rsp
 274         sgdt    (%rsp)
 275         movq    2(%rsp), %rdi   /* gdt base now in %rdi */
 276         addq    $10, %rsp
 277         call    kdi_gdt2gsbase  /* returns kernel's GSBASE in %rax */
 278 
 279         movq    %rax, %rdx
 280         shrq    $32, %rdx
 281         movl    $MSR_AMD_GSBASE, %ecx
 282         wrmsr
 283 #endif  /* __xpv */
 284 
 285         GET_CPUSAVE_ADDR        /* %rax = cpusave, %rbx = CPU ID */
 286 
 287         ADVANCE_CRUMB_POINTER(%rax, %rcx, %rdx)
 288 
 289         ADD_CRUMB(%rax, KRM_CPU_STATE, $KDI_CPU_STATE_MASTER, %rdx)
 290 
 291         movq    REG_OFF(KDIREG_RIP)(%rsp), %rcx
 292         ADD_CRUMB(%rax, KRM_PC, %rcx, %rdx)
 293         ADD_CRUMB(%rax, KRM_SP, %rsp, %rdx)
 294         movq    REG_OFF(KDIREG_TRAPNO)(%rsp), %rcx
 295         ADD_CRUMB(%rax, KRM_TRAPNO, %rcx, %rdx)
 296 
 297         movq    %rsp, %rbp
 298         pushq   %rax
 299 
 300         /*
 301          * Were we in the debugger when we took the trap (i.e. was %esp in one
 302          * of the debugger's memory ranges)?
 303          */
 304         leaq    kdi_memranges, %rcx
 305         movl    kdi_nmemranges, %edx
 306 1:      cmpq    MR_BASE(%rcx), %rsp
 307         jl      2f              /* below this range -- try the next one */
 308         cmpq    MR_LIM(%rcx), %rsp
 309         jg      2f              /* above this range -- try the next one */
 310         jmp     3f              /* matched within this range */
 311 
 312 2:      decl    %edx
 313         jz      kdi_save_common_state   /* %rsp not within debugger memory */
 314         addq    $MR_SIZE, %rcx
 315         jmp     1b
 316 
 317 3:      /*
 318          * The master is still set.  That should only happen if we hit a trap
 319          * while running in the debugger.  Note that it may be an intentional
 320          * fault.  kmdb_dpi_handle_fault will sort it all out.
 321          */
 322 
 323         movq    REG_OFF(KDIREG_TRAPNO)(%rbp), %rdi
 324         movq    REG_OFF(KDIREG_RIP)(%rbp), %rsi
 325         movq    REG_OFF(KDIREG_RSP)(%rbp), %rdx
 326         movq    %rbx, %rcx              /* cpuid */
 327 
 328         call    kdi_dvec_handle_fault
 329 
 330         /*
 331          * If we're here, we ran into a debugger problem, and the user
 332          * elected to solve it by having the debugger debug itself.  The
 333          * state we're about to save is that of the debugger when it took
 334          * the fault.
 335          */
 336 
 337         jmp     kdi_save_common_state
 338 
 339         SET_SIZE(kdi_master_entry)
 340         SET_SIZE(kdi_cmnint)
 341 
 342 #endif  /* __lint */
 343 
 344 /*
 345  * The cross-call handler for slave CPUs.
 346  *
 347  * The debugger is single-threaded, so only one CPU, called the master, may be
 348  * running it at any given time.  The other CPUs, known as slaves, spin in a
 349  * busy loop until there's something for them to do.  This is the entry point
 350  * for the slaves - they'll be sent here in response to a cross-call sent by the
 351  * master.
 352  */
 353 
 354 #if defined(__lint)
 355 void
 356 kdi_slave_entry(void)
 357 {
 358 }
 359 #else /* __lint */
 360         ENTRY_NP(kdi_slave_entry)
 361 
 362         /*
 363          * Cross calls are implemented as function calls, so our stack currently
 364          * looks like one you'd get from a zero-argument function call.  That
 365          * is, there's the return %rip at %rsp, and that's about it.  We need
 366          * to make it look like an interrupt stack.  When we first save, we'll
 367          * reverse the saved %ss and %rip, which we'll fix back up when we've
 368          * freed up some general-purpose registers.  We'll also need to fix up
 369          * the saved %rsp.
 370          */
 371 
 372         pushq   %rsp            /* pushed value off by 8 */
 373         pushfq
 374         CLI(%rax)
 375         pushq   $KCS_SEL
 376         clrq    %rax
 377         movw    %ss, %ax
 378         pushq   %rax            /* rip should be here */
 379         pushq   $-1             /* phony trap error code */
 380         pushq   $-1             /* phony trap number */
 381 
 382         subq    $REG_OFF(KDIREG_TRAPNO), %rsp
 383         KDI_SAVE_REGS(%rsp)
 384 
 385         movq    REG_OFF(KDIREG_SS)(%rsp), %rax
 386         xchgq   REG_OFF(KDIREG_RIP)(%rsp), %rax
 387         movq    %rax, REG_OFF(KDIREG_SS)(%rsp)
 388 
 389         movq    REG_OFF(KDIREG_RSP)(%rsp), %rax
 390         addq    $8, %rax
 391         movq    %rax, REG_OFF(KDIREG_RSP)(%rsp)
 392 
 393         /* 
 394          * We've saved all of the general-purpose registers, and have a stack
 395          * that is irettable (after we strip down to the error code)
 396          */
 397 
 398         GET_CPUSAVE_ADDR        /* %rax = cpusave, %rbx = CPU ID */
 399 
 400         ADVANCE_CRUMB_POINTER(%rax, %rcx, %rdx)
 401 
 402         ADD_CRUMB(%rax, KRM_CPU_STATE, $KDI_CPU_STATE_SLAVE, %rdx)
 403 
 404         movq    REG_OFF(KDIREG_RIP)(%rsp), %rcx
 405         ADD_CRUMB(%rax, KRM_PC, %rcx, %rdx)
 406 
 407         pushq   %rax
 408         jmp     kdi_save_common_state
 409 
 410         SET_SIZE(kdi_slave_entry)
 411 
 412 #endif  /* __lint */
 413 
 414 /*
 415  * The state of the world:
 416  *
 417  * The stack has a complete set of saved registers and segment
 418  * selectors, arranged in the kdi_regs.h order.  It also has a pointer
 419  * to our cpusave area.
 420  *
 421  * We need to save, into the cpusave area, a pointer to these saved
 422  * registers.  First we check whether we should jump straight back to
 423  * the kernel.  If not, we save a few more registers, ready the
 424  * machine for debugger entry, and enter the debugger.
 425  */
 426 
 427 #if !defined(__lint)
 428 
 429         ENTRY_NP(kdi_save_common_state)
 430 
 431         popq    %rdi                    /* the cpusave area */
 432         movq    %rsp, KRS_GREGS(%rdi)   /* save ptr to current saved regs */
 433 
 434         pushq   %rdi
 435         call    kdi_trap_pass
 436         cmpq    $1, %rax
 437         je      kdi_pass_to_kernel
 438         popq    %rax /* cpusave in %rax */
 439 
 440         SAVE_IDTGDT
 441 
 442 #if !defined(__xpv)
 443         /* Save off %cr0, and clear write protect */
 444         movq    %cr0, %rcx
 445         movq    %rcx, KRS_CR0(%rax)
 446         andq    $_BITNOT(CR0_WP), %rcx
 447         movq    %rcx, %cr0
 448 #endif
 449 
 450         /* Save the debug registers and disable any active watchpoints */
 451 
 452         movq    %rax, %r15              /* save cpusave area ptr */
 453         movl    $7, %edi
 454         call    kdi_dreg_get
 455         movq    %rax, KRS_DRCTL(%r15)
 456 
 457         andq    $_BITNOT(KDIREG_DRCTL_WPALLEN_MASK), %rax
 458         movq    %rax, %rsi
 459         movl    $7, %edi
 460         call    kdi_dreg_set
 461 
 462         movl    $6, %edi
 463         call    kdi_dreg_get
 464         movq    %rax, KRS_DRSTAT(%r15)
 465 
 466         movl    $0, %edi
 467         call    kdi_dreg_get
 468         movq    %rax, KRS_DROFF(0)(%r15)
 469 
 470         movl    $1, %edi
 471         call    kdi_dreg_get
 472         movq    %rax, KRS_DROFF(1)(%r15)
 473 
 474         movl    $2, %edi
 475         call    kdi_dreg_get
 476         movq    %rax, KRS_DROFF(2)(%r15)
 477 
 478         movl    $3, %edi
 479         call    kdi_dreg_get
 480         movq    %rax, KRS_DROFF(3)(%r15)
 481 
 482         movq    %r15, %rax      /* restore cpu save area to rax */
 483 
 484         clrq    %rbp            /* stack traces should end here */
 485 
 486         pushq   %rax
 487         movq    %rax, %rdi      /* cpusave */
 488 
 489         call    kdi_debugger_entry
 490 
 491         /* Pass cpusave to kdi_resume */
 492         popq    %rdi
 493 
 494         jmp     kdi_resume
 495 
 496         SET_SIZE(kdi_save_common_state)
 497 
 498 #endif  /* !__lint */
 499 
 500 /*
 501  * Resume the world.  The code that calls kdi_resume has already
 502  * decided whether or not to restore the IDT.
 503  */
 504 #if defined(__lint)
 505 void
 506 kdi_resume(void)
 507 {
 508 }
 509 #else   /* __lint */
 510 
 511         /* cpusave in %rdi */
 512         ENTRY_NP(kdi_resume)
 513 
 514         /*
 515          * Send this CPU back into the world
 516          */
 517 #if !defined(__xpv)
 518         movq    KRS_CR0(%rdi), %rdx
 519         movq    %rdx, %cr0
 520 #endif
 521 
 522         KDI_RESTORE_DEBUGGING_STATE
 523 
 524         movq    KRS_GREGS(%rdi), %rsp
 525         KDI_RESTORE_REGS(%rsp)
 526         addq    $REG_OFF(KDIREG_RIP), %rsp      /* Discard state, trapno, err */
 527         IRET
 528         /*NOTREACHED*/
 529         SET_SIZE(kdi_resume)
 530 
 531 #endif  /* __lint */
 532 
 533 #if !defined(__lint)
 534 
 535         ENTRY_NP(kdi_pass_to_kernel)
 536 
 537         popq    %rdi /* cpusave */
 538 
 539         movq    $KDI_CPU_STATE_NONE, KRS_CPU_STATE(%rdi)
 540 
 541         /*
 542          * Find the trap and vector off the right kernel handler.  The trap
 543          * handler will expect the stack to be in trap order, with %rip being
 544          * the last entry, so we'll need to restore all our regs.  On i86xpv
 545          * we'll need to compensate for XPV_TRAP_POP.
 546          *
 547          * We're hard-coding the three cases where KMDB has installed permanent
 548          * handlers, since after we KDI_RESTORE_REGS(), we don't have registers
 549          * to work with; we can't use a global since other CPUs can easily pass
 550          * through here at the same time.
 551          *
 552          * Note that we handle T_DBGENTR since userspace might have tried it.
 553          */
 554         movq    KRS_GREGS(%rdi), %rsp
 555         movq    REG_OFF(KDIREG_TRAPNO)(%rsp), %rdi
 556         cmpq    $T_SGLSTP, %rdi
 557         je      1f
 558         cmpq    $T_BPTFLT, %rdi
 559         je      2f
 560         cmpq    $T_DBGENTR, %rdi
 561         je      3f
 562         /*
 563          * Hmm, unknown handler.  Somebody forgot to update this when they
 564          * added a new trap interposition... try to drop back into kmdb.
 565          */
 566         int     $T_DBGENTR
 567         
 568 #define CALL_TRAP_HANDLER(name) \
 569         KDI_RESTORE_REGS(%rsp); \
 570         /* Discard state, trapno, err */ \
 571         addq    $REG_OFF(KDIREG_RIP), %rsp; \
 572         XPV_TRAP_PUSH; \
 573         jmp     %cs:name
 574 
 575 1:
 576         CALL_TRAP_HANDLER(dbgtrap)
 577         /*NOTREACHED*/
 578 2:
 579         CALL_TRAP_HANDLER(brktrap)
 580         /*NOTREACHED*/
 581 3:
 582         CALL_TRAP_HANDLER(invaltrap)
 583         /*NOTREACHED*/
 584 
 585         SET_SIZE(kdi_pass_to_kernel)
 586 
 587         /*
 588          * A minimal version of mdboot(), to be used by the master CPU only.
 589          */
 590         ENTRY_NP(kdi_reboot)
 591 
 592         movl    $AD_BOOT, %edi
 593         movl    $A_SHUTDOWN, %esi
 594         call    *psm_shutdownf
 595 #if defined(__xpv)
 596         movl    $SHUTDOWN_reboot, %edi
 597         call    HYPERVISOR_shutdown
 598 #else
 599         call    reset
 600 #endif
 601         /*NOTREACHED*/
 602 
 603         SET_SIZE(kdi_reboot)
 604 
 605 #endif  /* !__lint */
 606 
 607 #if defined(__lint)
 608 /*ARGSUSED*/
 609 void
 610 kdi_cpu_debug_init(kdi_cpusave_t *save)
 611 {
 612 }
 613 #else   /* __lint */
 614 
 615         ENTRY_NP(kdi_cpu_debug_init)
 616         pushq   %rbp
 617         movq    %rsp, %rbp
 618 
 619         pushq   %rbx            /* macro will clobber %rbx */
 620         KDI_RESTORE_DEBUGGING_STATE
 621         popq    %rbx
 622 
 623         leave
 624         ret
 625 
 626         SET_SIZE(kdi_cpu_debug_init)
 627 #endif  /* !__lint */
 628