]>
Commit | Line | Data |
---|---|---|
0c530ab8 | 1 | /* |
39236c6e | 2 | * Copyright (c) 2006-2012 Apple Inc. All rights reserved. |
0c530ab8 | 3 | * |
2d21ac55 | 4 | * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ |
0c530ab8 | 5 | * |
2d21ac55 A |
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. | |
0c530ab8 | 14 | * |
2d21ac55 A |
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 | |
0c530ab8 A |
20 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
21 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
2d21ac55 A |
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. | |
0c530ab8 | 25 | * |
2d21ac55 | 26 | * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ |
0c530ab8 A |
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 | ||
0c530ab8 A |
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> | |
0c530ab8 A |
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 | ||
0c530ab8 | 67 | #if DEBUG |
316670eb | 68 | extern void dump_regs64(void); |
0c530ab8 A |
69 | extern void dump_gdt(void *); |
70 | extern void dump_ldt(void *); | |
71 | extern void dump_idt(void *); | |
72 | extern void dump_tss(void *); | |
39236c6e | 73 | extern void dump_frame32(x86_saved_state32_t *sp); |
0c530ab8 A |
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)) | |
39236c6e | 81 | dump_frame32(&sp->ss_32); |
0c530ab8 A |
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 | |
39236c6e | 89 | dump_frame32(x86_saved_state32_t *sp) |
0c530ab8 A |
90 | { |
91 | unsigned int i; | |
39236c6e | 92 | uint32_t *ip = (uint32_t *) sp; |
0c530ab8 | 93 | |
39236c6e | 94 | kprintf("dump_frame32(%p):\n", sp); |
0c530ab8 A |
95 | |
96 | for (i = 0; | |
39236c6e | 97 | i < sizeof(x86_saved_state32_t)/sizeof(uint32_t); |
0c530ab8 | 98 | i++, ip++) |
2d21ac55 | 99 | kprintf("%p: 0x%08x\n", ip, *ip); |
0c530ab8 | 100 | |
39236c6e A |
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); | |
0c530ab8 A |
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++) | |
2d21ac55 | 134 | kprintf("%p: 0x%016llx\n", ip, *ip); |
0c530ab8 A |
135 | |
136 | kprintf("sp->isf.trapno: 0x%08x\n", sp->isf.trapno); | |
b0d623f7 | 137 | kprintf("sp->isf.trapfn: 0x%016llx\n", sp->isf.trapfn); |
0c530ab8 A |
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); | |
0c530ab8 A |
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 | ||
2d21ac55 | 173 | kprintf("GDT:\n"); |
0c530ab8 A |
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 | ||
2d21ac55 | 186 | kprintf("LDT:\n"); |
0c530ab8 A |
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 | ||
2d21ac55 | 199 | kprintf("IDT64:\n"); |
0c530ab8 A |
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 | ||
2d21ac55 | 214 | kprintf("TSS64:\n"); |
0c530ab8 A |
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 | } | |
316670eb | 219 | |
316670eb A |
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 | } | |
0c530ab8 | 262 | #endif /* DEBUG */ |