1/* 2 * Copyright (c) 2006-2012 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 29#include <string.h> 30 31#include <mach/machine/vm_types.h> 32 33#include <mach/boolean.h> 34#include <kern/thread.h> 35#include <kern/zalloc.h> 36 37#include <kern/kalloc.h> 38#include <kern/spl.h> 39 40#include <vm/pmap.h> 41#include <vm/vm_map.h> 42#include <vm/vm_kern.h> 43#include <mach/vm_param.h> 44#include <mach/vm_prot.h> 45#include <vm/vm_object.h> 46#include <vm/vm_page.h> 47 48#include <mach/machine/vm_param.h> 49#include <machine/thread.h> 50 51#include <kern/misc_protos.h> /* prototyping */ 52#include <i386/misc_protos.h> 53 54#include <i386/cpuid.h> 55#include <i386/cpu_data.h> 56#include <i386/mp.h> 57#include <i386/cpu_number.h> 58#include <i386/machine_cpu.h> 59#include <i386/seg.h> 60 61#include <vm/vm_protos.h> 62 63#include <sys/kdebug.h> 64 65#include <i386/postcode.h> 66 67#if DEBUG 68extern void dump_regs64(void); 69extern void dump_gdt(void *); 70extern void dump_ldt(void *); 71extern void dump_idt(void *); 72extern void dump_tss(void *); 73extern void dump_frame32(x86_saved_state32_t *sp); 74extern void dump_frame64(x86_saved_state64_t *sp); 75extern void dump_frame(x86_saved_state_t *sp); 76 77void 78dump_frame(x86_saved_state_t *sp) 79{ 80 if (is_saved_state32(sp)) 81 dump_frame32(&sp->ss_32); 82 else if (is_saved_state64(sp)) 83 dump_frame64(&sp->ss_64); 84 else 85 kprintf("dump_frame(%p) unknown type %d\n", sp, sp->flavor); 86} 87 88void 89dump_frame32(x86_saved_state32_t *sp) 90{ 91 unsigned int i; 92 uint32_t *ip = (uint32_t *) sp; 93 94 kprintf("dump_frame32(%p):\n", sp); 95 96 for (i = 0; 97 i < sizeof(x86_saved_state32_t)/sizeof(uint32_t); 98 i++, ip++) 99 kprintf("%p: 0x%08x\n", ip, *ip); 100 101 kprintf("sp->gs: 0x%08x\n", sp->gs); 102 kprintf("sp->fs: 0x%08x\n", sp->fs); 103 kprintf("sp->es: 0x%08x\n", sp->es); 104 kprintf("sp->ds: 0x%08x\n", sp->ds); 105 kprintf("sp->edi: 0x%08x\n", sp->edi); 106 kprintf("sp->esi: 0x%08x\n", sp->esi); 107 kprintf("sp->ebp: 0x%08x\n", sp->ebp); 108 kprintf("sp->cr2: 0x%08x\n", sp->cr2); 109 kprintf("sp->ebx: 0x%08x\n", sp->ebx); 110 kprintf("sp->edx: 0x%08x\n", sp->edx); 111 kprintf("sp->ecx: 0x%08x\n", sp->ecx); 112 kprintf("sp->eax: 0x%08x\n", sp->eax); 113 kprintf("sp->trapno: 0x%08x\n", sp->eax); 114 kprintf("sp->eip: 0x%08x\n", sp->eip); 115 kprintf("sp->cs: 0x%08x\n", sp->cs); 116 kprintf("sp->efl: 0x%08x\n", sp->efl); 117 kprintf("sp->uesp: 0x%08x\n", sp->uesp); 118 kprintf("sp->ss: 0x%08x\n", sp->ss); 119 120 postcode(0x99); 121} 122 123void 124dump_frame64(x86_saved_state64_t *sp) 125{ 126 unsigned int i; 127 uint64_t *ip = (uint64_t *) sp; 128 129 kprintf("dump_frame64(%p):\n", sp); 130 131 for (i = 0; 132 i < sizeof(x86_saved_state64_t)/sizeof(uint64_t); 133 i++, ip++) 134 kprintf("%p: 0x%016llx\n", ip, *ip); 135 136 kprintf("sp->isf.trapno: 0x%08x\n", sp->isf.trapno); 137 kprintf("sp->isf.trapfn: 0x%016llx\n", sp->isf.trapfn); 138 kprintf("sp->isf.err: 0x%016llx\n", sp->isf.err); 139 kprintf("sp->isf.rip: 0x%016llx\n", sp->isf.rip); 140 kprintf("sp->isf.cs: 0x%016llx\n", sp->isf.cs); 141 kprintf("sp->isf.rflags: 0x%016llx\n", sp->isf.rflags); 142 kprintf("sp->isf.rsp: 0x%016llx\n", sp->isf.rsp); 143 kprintf("sp->isf.ss: 0x%016llx\n", sp->isf.ss); 144 145 kprintf("sp->fs: 0x%016x\n", sp->fs); 146 kprintf("sp->gs: 0x%016x\n", sp->gs); 147 kprintf("sp->rax: 0x%016llx\n", sp->rax); 148 kprintf("sp->rcx: 0x%016llx\n", sp->rcx); 149 kprintf("sp->rbx: 0x%016llx\n", sp->rbx); 150 kprintf("sp->rbp: 0x%016llx\n", sp->rbp); 151 kprintf("sp->r11: 0x%016llx\n", sp->r11); 152 kprintf("sp->r12: 0x%016llx\n", sp->r12); 153 kprintf("sp->r13: 0x%016llx\n", sp->r13); 154 kprintf("sp->r14: 0x%016llx\n", sp->r14); 155 kprintf("sp->r15: 0x%016llx\n", sp->r15); 156 kprintf("sp->cr2: 0x%016llx\n", sp->cr2); 157 kprintf("sp->r9: 0x%016llx\n", sp->r9); 158 kprintf("sp->r8: 0x%016llx\n", sp->r8); 159 kprintf("sp->r10: 0x%016llx\n", sp->r10); 160 kprintf("sp->rdx: 0x%016llx\n", sp->rdx); 161 kprintf("sp->rsi: 0x%016llx\n", sp->rsi); 162 kprintf("sp->rdi: 0x%016llx\n", sp->rdi); 163 164 postcode(0x98); 165} 166 167void 168dump_gdt(void *gdtp) 169{ 170 unsigned int i; 171 uint32_t *ip = (uint32_t *) gdtp; 172 173 kprintf("GDT:\n"); 174 for (i = 0; i < GDTSZ; i++, ip += 2) { 175 kprintf("%p: 0x%08x\n", ip+0, *(ip+0)); 176 kprintf("%p: 0x%08x\n", ip+1, *(ip+1)); 177 } 178} 179 180void 181dump_ldt(void *ldtp) 182{ 183 unsigned int i; 184 uint32_t *ip = (uint32_t *) ldtp; 185 186 kprintf("LDT:\n"); 187 for (i = 0; i < LDTSZ_MIN; i++, ip += 2) { 188 kprintf("%p: 0x%08x\n", ip+0, *(ip+0)); 189 kprintf("%p: 0x%08x\n", ip+1, *(ip+1)); 190 } 191} 192 193void 194dump_idt(void *idtp) 195{ 196 unsigned int i; 197 uint32_t *ip = (uint32_t *) idtp; 198 199 kprintf("IDT64:\n"); 200 for (i = 0; i < 16; i++, ip += 4) { 201 kprintf("%p: 0x%08x\n", ip+0, *(ip+0)); 202 kprintf("%p: 0x%08x\n", ip+1, *(ip+1)); 203 kprintf("%p: 0x%08x\n", ip+2, *(ip+2)); 204 kprintf("%p: 0x%08x\n", ip+3, *(ip+3)); 205 } 206} 207 208void 209dump_tss(void *tssp) 210{ 211 unsigned int i; 212 uint32_t *ip = (uint32_t *) tssp; 213 214 kprintf("TSS64:\n"); 215 for (i = 0; i < sizeof(master_ktss64)/sizeof(uint32_t); i++, ip++) { 216 kprintf("%p: 0x%08x\n", ip+0, *(ip+0)); 217 } 218} 219 220void dump_regs64(void) 221{ 222 223#define SNAP_REG(reg) \ 224 uint64_t reg; \ 225 __asm__ volatile("mov %%" #reg ", %0" : "=m" (reg)) 226 227#define KPRINT_REG(reg) \ 228 kprintf("%3s: %p\n", #reg, (void *) reg) 229 230 SNAP_REG(rsp); 231 SNAP_REG(rbp); 232 SNAP_REG(rax); 233 SNAP_REG(rbx); 234 SNAP_REG(rcx); 235 SNAP_REG(rdx); 236 SNAP_REG(rsi); 237 SNAP_REG(rdi); 238 SNAP_REG(r8); 239 SNAP_REG(r9); 240 SNAP_REG(r10); 241 SNAP_REG(r11); 242 SNAP_REG(r12); 243 SNAP_REG(r13); 244 SNAP_REG(r14); 245 246 KPRINT_REG(rsp); 247 KPRINT_REG(rbp); 248 KPRINT_REG(rax); 249 KPRINT_REG(rbx); 250 KPRINT_REG(rcx); 251 KPRINT_REG(rdx); 252 KPRINT_REG(rsi); 253 KPRINT_REG(rdi); 254 KPRINT_REG(r8); 255 KPRINT_REG(r9); 256 KPRINT_REG(r10); 257 KPRINT_REG(r11); 258 KPRINT_REG(r12); 259 KPRINT_REG(r13); 260 KPRINT_REG(r14); 261} 262#endif /* DEBUG */ 263