summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2015-09-11 03:24:07 +0000
committermarkj <markj@FreeBSD.org>2015-09-11 03:24:07 +0000
commitdfb0cc5c03efdfd24efc1469b804742fd2d9bc5d (patch)
tree11760d447b62e31159f31afdca3fc3efbac38fae /sys
parent3ff7032ecdcf849960103d5e02a6ff33abfed3ce (diff)
downloadFreeBSD-src-dfb0cc5c03efdfd24efc1469b804742fd2d9bc5d.zip
FreeBSD-src-dfb0cc5c03efdfd24efc1469b804742fd2d9bc5d.tar.gz
Merge stack(9) implementations for i386 and amd64 under x86/.
Reviewed by: jhb, kib Sponsored by: EMC / Isilon Storage Division Differential Revision: https://reviews.freebsd.org/D3255
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/include/stack.h42
-rw-r--r--sys/conf/files.amd642
-rw-r--r--sys/conf/files.i3862
-rw-r--r--sys/conf/files.pc982
-rw-r--r--sys/i386/i386/stack_machdep.c87
-rw-r--r--sys/i386/include/stack.h42
-rw-r--r--sys/x86/include/stack.h58
-rw-r--r--sys/x86/x86/stack_machdep.c (renamed from sys/amd64/amd64/stack_machdep.c)37
8 files changed, 94 insertions, 178 deletions
diff --git a/sys/amd64/include/stack.h b/sys/amd64/include/stack.h
index 8297eae..091ae33 100644
--- a/sys/amd64/include/stack.h
+++ b/sys/amd64/include/stack.h
@@ -1,42 +1,6 @@
-/*-
- * Mach Operating System
- * Copyright (c) 1991,1990 Carnegie Mellon University
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie the
- * rights to redistribute these changes.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_STACK_H_
-#define _MACHINE_STACK_H_
-
/*
- * Stack trace.
+ * This file is in the public domain.
*/
+/* $FreeBSD$ */
-struct amd64_frame {
- struct amd64_frame *f_frame;
- long f_retaddr;
- long f_arg0;
-};
-
-#endif /* !_MACHINE_STACK_H_ */
+#include <x86/stack.h>
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index bd70825..3def78f 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -130,7 +130,6 @@ amd64/amd64/pmap.c standard
amd64/amd64/prof_machdep.c optional profiling-routine
amd64/amd64/ptrace_machdep.c standard
amd64/amd64/sigtramp.S standard
-amd64/amd64/stack_machdep.c optional ddb | stack
amd64/amd64/support.S standard
amd64/amd64/sys_machdep.c standard
amd64/amd64/trap.c standard
@@ -612,6 +611,7 @@ x86/x86/mp_x86.c optional smp
x86/x86/msi.c optional pci
x86/x86/nexus.c standard
x86/x86/pvclock.c standard
+x86/x86/stack_machdep.c optional ddb | stack
x86/x86/tsc.c standard
x86/x86/delay.c standard
x86/xen/hvm.c optional xenhvm
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index aed5b9d..1fae3a5 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -476,7 +476,6 @@ i386/i386/mpboot.s optional smp
i386/i386/perfmon.c optional perfmon
i386/i386/pmap.c standard
i386/i386/ptrace_machdep.c standard
-i386/i386/stack_machdep.c optional ddb | stack
i386/i386/support.s standard
i386/i386/swtch.s standard
i386/i386/sys_machdep.c standard
@@ -603,6 +602,7 @@ x86/x86/mptable_pci.c optional apic pci
x86/x86/mp_x86.c optional smp
x86/x86/msi.c optional apic pci
x86/x86/nexus.c standard
+x86/x86/stack_machdep.c optional ddb | stack
x86/x86/tsc.c standard
x86/x86/pvclock.c standard
x86/x86/delay.c standard
diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98
index 28a94a8..ee6cf71 100644
--- a/sys/conf/files.pc98
+++ b/sys/conf/files.pc98
@@ -174,7 +174,6 @@ i386/i386/mpboot.s optional smp
i386/i386/perfmon.c optional perfmon
i386/i386/pmap.c standard
i386/i386/ptrace_machdep.c standard
-i386/i386/stack_machdep.c optional ddb | stack
i386/i386/support.s standard
i386/i386/swtch.s standard
i386/i386/sys_machdep.c standard
@@ -274,5 +273,6 @@ x86/x86/mptable.c optional apic
x86/x86/mptable_pci.c optional apic pci
x86/x86/msi.c optional apic pci
x86/x86/nexus.c standard
+x86/x86/stack_machdep.c optional ddb | stack
x86/x86/tsc.c standard
x86/x86/delay.c standard
diff --git a/sys/i386/i386/stack_machdep.c b/sys/i386/i386/stack_machdep.c
deleted file mode 100644
index 8dbb9ab..0000000
--- a/sys/i386/i386/stack_machdep.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*-
- * Copyright (c) 2005 Antoine Brodin
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/proc.h>
-#include <sys/stack.h>
-
-#include <machine/pcb.h>
-#include <machine/stack.h>
-
-#include <vm/vm.h>
-#include <vm/vm_param.h>
-#include <vm/pmap.h>
-
-static void
-stack_capture(struct thread *td, struct stack *st, register_t ebp)
-{
- struct i386_frame *frame;
- vm_offset_t callpc;
-
- stack_zero(st);
- frame = (struct i386_frame *)ebp;
- while (1) {
- if (!INKERNEL(frame))
- break;
- callpc = frame->f_retaddr;
- if (!INKERNEL(callpc))
- break;
- if (stack_put(st, callpc) == -1)
- break;
- if (frame->f_frame <= frame ||
- (vm_offset_t)frame->f_frame >= td->td_kstack +
- td->td_kstack_pages * PAGE_SIZE)
- break;
- frame = frame->f_frame;
- }
-}
-
-void
-stack_save_td(struct stack *st, struct thread *td)
-{
- register_t ebp;
-
- if (TD_IS_SWAPPED(td))
- panic("stack_save_td: swapped");
- if (TD_IS_RUNNING(td))
- panic("stack_save_td: running");
-
- ebp = td->td_pcb->pcb_ebp;
- stack_capture(td, st, ebp);
-}
-
-void
-stack_save(struct stack *st)
-{
- register_t ebp;
-
- __asm __volatile("movl %%ebp,%0" : "=r" (ebp));
- stack_capture(curthread, st, ebp);
-}
diff --git a/sys/i386/include/stack.h b/sys/i386/include/stack.h
index f63fc4b..091ae33 100644
--- a/sys/i386/include/stack.h
+++ b/sys/i386/include/stack.h
@@ -1,42 +1,6 @@
-/*-
- * Mach Operating System
- * Copyright (c) 1991,1990 Carnegie Mellon University
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie the
- * rights to redistribute these changes.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_STACK_H_
-#define _MACHINE_STACK_H_
-
/*
- * Stack trace.
+ * This file is in the public domain.
*/
+/* $FreeBSD$ */
-struct i386_frame {
- struct i386_frame *f_frame;
- int f_retaddr;
- int f_arg0;
-};
-
-#endif /* !_MACHINE_STACK_H_ */
+#include <x86/stack.h>
diff --git a/sys/x86/include/stack.h b/sys/x86/include/stack.h
new file mode 100644
index 0000000..8e45b82
--- /dev/null
+++ b/sys/x86/include/stack.h
@@ -0,0 +1,58 @@
+/*-
+ * Mach Operating System
+ * Copyright (c) 1991,1990 Carnegie Mellon University
+ * All Rights Reserved.
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _X86_STACK_H
+#define _X86_STACK_H
+
+/*
+ * Stack trace.
+ */
+
+#ifdef __i386__
+struct i386_frame {
+ struct i386_frame *f_frame;
+ u_int f_retaddr;
+ u_int f_arg0;
+};
+#endif
+
+#ifdef __amd64__
+struct amd64_frame {
+ struct amd64_frame *f_frame;
+ u_long f_retaddr;
+ u_long f_arg0;
+};
+
+struct i386_frame {
+ uint32_t f_frame;
+ uint32_t f_retaddr;
+ uint32_t f_arg0;
+};
+#endif /* __amd64__ */
+
+#endif /* !_X86_STACK_H */
diff --git a/sys/amd64/amd64/stack_machdep.c b/sys/x86/x86/stack_machdep.c
index 2412c93..3ebf5a9 100644
--- a/sys/amd64/amd64/stack_machdep.c
+++ b/sys/x86/x86/stack_machdep.c
@@ -32,21 +32,36 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/stack.h>
+#include <x86/stack.h>
+
#include <machine/pcb.h>
-#include <machine/stack.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
+#ifdef __i386__
+#define PCB_FP(pcb) ((pcb)->pcb_ebp)
+#define TF_FP(tf) ((tf)->tf_ebp)
+#define TF_PC(tf) ((tf)->tf_eip)
+
+typedef struct i386_frame *x86_frame_t;
+#else
+#define PCB_FP(pcb) ((pcb)->pcb_rbp)
+#define TF_FP(tf) ((tf)->tf_rbp)
+#define TF_PC(tf) ((tf)->tf_rip)
+
+typedef struct amd64_frame *x86_frame_t;
+#endif
+
static void
-stack_capture(struct thread *td, struct stack *st, register_t rbp)
+stack_capture(struct thread *td, struct stack *st, register_t fp)
{
- struct amd64_frame *frame;
+ x86_frame_t frame;
vm_offset_t callpc;
stack_zero(st);
- frame = (struct amd64_frame *)rbp;
+ frame = (x86_frame_t)fp;
while (1) {
if (!INKERNEL((long)frame))
break;
@@ -66,22 +81,24 @@ stack_capture(struct thread *td, struct stack *st, register_t rbp)
void
stack_save_td(struct stack *st, struct thread *td)
{
- register_t rbp;
if (TD_IS_SWAPPED(td))
panic("stack_save_td: swapped");
if (TD_IS_RUNNING(td))
panic("stack_save_td: running");
- rbp = td->td_pcb->pcb_rbp;
- stack_capture(td, st, rbp);
+ stack_capture(td, st, PCB_FP(td->td_pcb));
}
void
stack_save(struct stack *st)
{
- register_t rbp;
+ register_t fp;
- __asm __volatile("movq %%rbp,%0" : "=r" (rbp));
- stack_capture(curthread, st, rbp);
+#ifdef __i386__
+ __asm __volatile("movl %%ebp,%0" : "=g" (fp));
+#else
+ __asm __volatile("movq %%rbp,%0" : "=g" (fp));
+#endif
+ stack_capture(curthread, st, fp);
}
OpenPOWER on IntegriCloud