1 /*- 2 * Copyright (c) 2003 Peter Wemm. 3 * Copyright (c) 1990 The Regents of the University of California. 4 * Copyright (c) 2008-2018 The DragonFly Project. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * William Jolitz. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. Neither the name of the University nor the names of its contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * from: @(#)frame.h 5.2 (Berkeley) 1/18/91 35 * $FreeBSD: src/sys/amd64/include/frame.h,v 1.26 2003/11/08 04:39:22 peter Exp $ 36 */ 37 38 #ifndef _CPU_FRAME_H_ 39 #define _CPU_FRAME_H_ 40 41 /* JG? */ 42 #include <sys/types.h> 43 44 /* 45 * System stack frames. 46 */ 47 48 /* 49 * Exception/Trap Stack Frame 50 * 51 * The ordering of this is specifically so that we can take first 6 52 * the syscall arguments directly from the beginning of the frame. 53 */ 54 55 struct trapframe { 56 /* note: tf_rdi matches mc_rdi in mcontext */ 57 register_t tf_rdi; 58 register_t tf_rsi; 59 register_t tf_rdx; 60 register_t tf_rcx; 61 register_t tf_r8; 62 register_t tf_r9; 63 register_t tf_rax; 64 register_t tf_rbx; 65 register_t tf_rbp; 66 register_t tf_r10; 67 register_t tf_r11; 68 register_t tf_r12; 69 register_t tf_r13; 70 register_t tf_r14; 71 register_t tf_r15; 72 register_t tf_xflags; 73 register_t tf_trapno; 74 register_t tf_addr; 75 register_t tf_flags; 76 /* below portion defined in hardware */ 77 register_t tf_err; 78 register_t tf_rip; 79 register_t tf_cs; 80 register_t tf_rflags; 81 #define tf_sp tf_rsp 82 register_t tf_rsp; 83 register_t tf_ss; 84 } __packed; 85 86 /* Interrupt stack frame */ 87 88 struct intrframe { 89 register_t if_vec; /* vec */ 90 /* fs XXX */ 91 /* es XXX */ 92 /* ds XXX */ 93 register_t if_rdi; 94 register_t if_rsi; 95 register_t if_rdx; 96 register_t if_rcx; 97 register_t if_r8; 98 register_t if_r9; 99 register_t if_rax; 100 register_t if_rbx; 101 register_t if_rbp; 102 register_t if_r10; 103 register_t if_r11; 104 register_t if_r12; 105 register_t if_r13; 106 register_t if_r14; 107 register_t if_r15; 108 register_t if_xflags; /* compat with trap frame - xflags */ 109 register_t :64; /* compat with trap frame - trapno */ 110 register_t :64; /* compat with trap frame - addr */ 111 register_t :64; /* compat with trap frame - flags */ 112 register_t :64; /* compat with trap frame - err */ 113 /* below portion defined in hardware */ 114 register_t if_rip; 115 register_t if_cs; 116 register_t if_rflags; 117 register_t if_rsp; 118 register_t if_ss; 119 } __packed; 120 121 /* 122 * The trampframe is placed at the top of the trampoline page and 123 * contains all the information needed to trampoline into and out 124 * of the isolated user pmap. 125 */ 126 struct trampframe { 127 register_t tr_cr2; 128 register_t tr_rax; 129 register_t tr_rcx; 130 register_t tr_rdx; 131 register_t tr_err; 132 register_t tr_rip; 133 register_t tr_cs; 134 register_t tr_rflags; 135 register_t tr_rsp; 136 register_t tr_ss; 137 138 /* 139 * Top of hw stack in TSS is &tr_pcb_rsp (first push is tr_ss). 140 * Make sure this is at least 16-byte aligned, so be sure the 141 * fields below are in multiples of 16 bytes. 142 */ 143 register_t tr_pcb_rsp; /* hw frame tramp top of stack */ 144 register_t tr_pcb_flags; /* copy of pcb control flags */ 145 register_t tr_pcb_cr3_iso; /* copy of isolated pml4e */ 146 register_t tr_pcb_cr3; /* copy of primary pml4e */ 147 uint32_t tr_pcb_spec_ctrl[2];/* SPEC_CTRL + ficticious flags */ 148 register_t tr_pcb_gs_kernel; /* (used by nmi, dbg) */ 149 register_t tr_pcb_gs_saved; /* (used by nmi) */ 150 register_t tr_pcb_cr3_saved; /* (used by nmi) */ 151 } __packed; 152 153 int kdb_trap(int, int, struct trapframe *); 154 155 #endif /* _CPU_FRAME_H_ */ 156