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 |
68 | extern void dump_regs64(void); |
69 | extern void dump_gdt(void *); |
70 | extern void dump_ldt(void *); |
71 | extern void dump_idt(void *); |
72 | extern void dump_tss(void *); |
73 | extern void dump_frame32(x86_saved_state32_t *sp); |
74 | extern void dump_frame64(x86_saved_state64_t *sp); |
75 | extern void dump_frame(x86_saved_state_t *sp); |
76 | |
77 | void |
78 | dump_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 | |
88 | void |
89 | dump_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 | |
123 | void |
124 | dump_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 | |
167 | void |
168 | dump_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 | |
180 | void |
181 | dump_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 | |
193 | void |
194 | dump_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 | |
208 | void |
209 | dump_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 | |
220 | void 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 | |