Module Name:    src
Committed By:   kamil
Date:           Thu Feb 15 15:53:57 UTC 2018

Modified Files:
        src/sys/arch/aarch64/include: mcontext.h
        src/sys/arch/alpha/include: mcontext.h
        src/sys/arch/amd64/include: mcontext.h
        src/sys/arch/arm/include: mcontext.h
        src/sys/arch/hppa/include: mcontext.h
        src/sys/arch/i386/include: mcontext.h
        src/sys/arch/ia64/include: mcontext.h
        src/sys/arch/m68k/include: mcontext.h
        src/sys/arch/mips/include: mcontext.h
        src/sys/arch/or1k/include: mcontext.h
        src/sys/arch/powerpc/include: mcontext.h
        src/sys/arch/riscv/include: mcontext.h
        src/sys/arch/sh3/include: mcontext.h
        src/sys/arch/sparc/include: mcontext.h
        src/sys/arch/vax/include: mcontext.h

Log Message:
Introduce _UC_MACHINE_FP() as a macro

_UC_MACHINE_FP() is a helper macro to extract from mcontext a frame pointer.

Don't rely on this interface as a compiler might strip frame pointer or
optimize it making this interface unreliable.

For hppa assume a small frame context, for larger frames FP might be located
in a different register (4 instead of 3).

For ia64 there is no strict frame pointer, and registers might rotate.
Reuse 79 following:

  ./gcc/config/ia64/ia64.h:#define HARD_FRAME_POINTER_REGNUM  LOC_REG (79)

Once ia64 will mature, this should be revisited.

A macro can encapsulate a real function for extracting Frame Pointer on
more complex CPUs / ABIs.

For the remaining CPUs, reuse standard register as defined in appropriate ABI.

The direct users of this macro are LLVM and GCC with Sanitizers.

Proposed on tech-userlevel@.

Sponsored by <The NetBSD Foundation>


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/aarch64/include/mcontext.h
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/alpha/include/mcontext.h
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/amd64/include/mcontext.h
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/arm/include/mcontext.h
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/hppa/include/mcontext.h
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/i386/include/mcontext.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/ia64/include/mcontext.h
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/m68k/include/mcontext.h
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/mips/include/mcontext.h
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/or1k/include/mcontext.h
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/powerpc/include/mcontext.h
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/riscv/include/mcontext.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/sh3/include/mcontext.h
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/sparc/include/mcontext.h
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/vax/include/mcontext.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/aarch64/include/mcontext.h
diff -u src/sys/arch/aarch64/include/mcontext.h:1.1 src/sys/arch/aarch64/include/mcontext.h:1.2
--- src/sys/arch/aarch64/include/mcontext.h:1.1	Sun Aug 10 05:47:38 2014
+++ src/sys/arch/aarch64/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: mcontext.h,v 1.1 2014/08/10 05:47:38 matt Exp $ */
+/* $NetBSD: mcontext.h,v 1.2 2018/02/15 15:53:56 kamil Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -106,6 +106,7 @@ typedef struct {
 #define	_UC_TLSBASE	0x00080000	/* see <sys/ucontext.h> */
 
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_SP])
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_X29])
 #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
 #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_X0])
 

Index: src/sys/arch/alpha/include/mcontext.h
diff -u src/sys/arch/alpha/include/mcontext.h:1.8 src/sys/arch/alpha/include/mcontext.h:1.9
--- src/sys/arch/alpha/include/mcontext.h:1.8	Wed Sep 12 02:00:54 2012
+++ src/sys/arch/alpha/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.8 2012/09/12 02:00:54 manu Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.9 2018/02/15 15:53:56 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -96,6 +96,7 @@ typedef struct {
 #define _UC_TLSBASE	0x20	/* valid process-unique value in _REG_UNIQUE */
 
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_SP])
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_S6])
 #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
 #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_V0])
 

Index: src/sys/arch/amd64/include/mcontext.h
diff -u src/sys/arch/amd64/include/mcontext.h:1.18 src/sys/arch/amd64/include/mcontext.h:1.19
--- src/sys/arch/amd64/include/mcontext.h:1.18	Mon May 12 22:50:03 2014
+++ src/sys/arch/amd64/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.18 2014/05/12 22:50:03 uebayasi Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.19 2018/02/15 15:53:56 kamil Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -68,6 +68,7 @@ typedef struct {
 
 /* AMD64 ABI 128-bytes "red zone". */
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_RSP] - 128)
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_RBP])
 #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_RIP])
 #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_RAX])
 

Index: src/sys/arch/arm/include/mcontext.h
diff -u src/sys/arch/arm/include/mcontext.h:1.18 src/sys/arch/arm/include/mcontext.h:1.19
--- src/sys/arch/arm/include/mcontext.h:1.18	Tue Mar 24 08:38:29 2015
+++ src/sys/arch/arm/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.18 2015/03/24 08:38:29 matt Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.19 2018/02/15 15:53:56 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -110,6 +110,7 @@ typedef struct {
 #define _UC_MACHINE_PAD	1		/* Padding appended to ucontext_t */
 
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_SP])
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_R11])
 #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
 #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_R0])
 

Index: src/sys/arch/hppa/include/mcontext.h
diff -u src/sys/arch/hppa/include/mcontext.h:1.8 src/sys/arch/hppa/include/mcontext.h:1.9
--- src/sys/arch/hppa/include/mcontext.h:1.8	Wed Feb 19 13:01:51 2014
+++ src/sys/arch/hppa/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.8 2014/02/19 13:01:51 skrll Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.9 2018/02/15 15:53:56 kamil Exp $	*/
 
 #ifndef _HPPA_MCONTEXT_H_
 #define	_HPPA_MCONTEXT_H_
@@ -50,6 +50,7 @@ typedef struct {
 } mcontext_t;
 
 #define	_UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_SP])
+#define	_UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[3])
 #define	_UC_MACHINE_PC(uc) 	((uc)->uc_mcontext.__gregs[_REG_PCOQH])
 #define	_UC_MACHINE_SET_PC(uc, pc)					\
 do {									\

Index: src/sys/arch/i386/include/mcontext.h
diff -u src/sys/arch/i386/include/mcontext.h:1.13 src/sys/arch/i386/include/mcontext.h:1.14
--- src/sys/arch/i386/include/mcontext.h:1.13	Sat Aug 12 07:35:08 2017
+++ src/sys/arch/i386/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.13 2017/08/12 07:35:08 maxv Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.14 2018/02/15 15:53:56 kamil Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -105,6 +105,7 @@ typedef struct {
 #ifndef _UC_MACHINE_SP
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_UESP])
 #endif
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_EBP])
 #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_EIP])
 #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_EAX])
 

Index: src/sys/arch/ia64/include/mcontext.h
diff -u src/sys/arch/ia64/include/mcontext.h:1.5 src/sys/arch/ia64/include/mcontext.h:1.6
--- src/sys/arch/ia64/include/mcontext.h:1.5	Fri Aug  5 17:01:13 2016
+++ src/sys/arch/ia64/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.5 2016/08/05 17:01:13 scole Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.6 2018/02/15 15:53:56 kamil Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -112,6 +112,7 @@ typedef struct __mcontext {
 } mcontext_t;
 
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.mc_special.sp)
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[79])
 /* XXX or assembly "mov Rn = ip" or ...? */
 #define	_UC_MACHINE_PC(uc)	((uc)->uc_mcontext.mc_special.iip)
 

Index: src/sys/arch/m68k/include/mcontext.h
diff -u src/sys/arch/m68k/include/mcontext.h:1.9 src/sys/arch/m68k/include/mcontext.h:1.10
--- src/sys/arch/m68k/include/mcontext.h:1.9	Tue Nov 22 15:25:28 2011
+++ src/sys/arch/m68k/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.9 2011/11/22 15:25:28 joerg Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.10 2018/02/15 15:53:56 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -102,6 +102,7 @@ typedef struct {
 #define	_UC_TLSBASE	0x00080000
 
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_A7])
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_A6])
 #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
 #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_D0])
 

Index: src/sys/arch/mips/include/mcontext.h
diff -u src/sys/arch/mips/include/mcontext.h:1.21 src/sys/arch/mips/include/mcontext.h:1.22
--- src/sys/arch/mips/include/mcontext.h:1.21	Tue May 26 02:16:38 2015
+++ src/sys/arch/mips/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.21 2015/05/26 02:16:38 matt Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.22 2018/02/15 15:53:56 kamil Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2002 The NetBSD Foundation, Inc.
@@ -159,6 +159,7 @@ typedef struct {
 #define	_UC_TLSBASE	0x00040000
 
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_SP])
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_S8])
 #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_EPC])
 #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_V0])
 

Index: src/sys/arch/or1k/include/mcontext.h
diff -u src/sys/arch/or1k/include/mcontext.h:1.1 src/sys/arch/or1k/include/mcontext.h:1.2
--- src/sys/arch/or1k/include/mcontext.h:1.1	Wed Sep  3 19:34:26 2014
+++ src/sys/arch/or1k/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: mcontext.h,v 1.1 2014/09/03 19:34:26 matt Exp $ */
+/* $NetBSD: mcontext.h,v 1.2 2018/02/15 15:53:56 kamil Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -88,6 +88,7 @@ typedef struct {
 #define	_UC_TLSBASE	0x00080000	/* see <sys/ucontext.h> */
 
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_SP])
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_R2])
 #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
 #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_RV])
 

Index: src/sys/arch/powerpc/include/mcontext.h
diff -u src/sys/arch/powerpc/include/mcontext.h:1.17 src/sys/arch/powerpc/include/mcontext.h:1.18
--- src/sys/arch/powerpc/include/mcontext.h:1.17	Tue Aug 12 20:27:10 2014
+++ src/sys/arch/powerpc/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.17 2014/08/12 20:27:10 joerg Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.18 2018/02/15 15:53:56 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -133,6 +133,7 @@ typedef struct {
 #define	_UC_TLSBASE	0x00080000	/* thread context valid in R2 */
 
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_R1])
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_R31])
 #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
 #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_R3])
 

Index: src/sys/arch/riscv/include/mcontext.h
diff -u src/sys/arch/riscv/include/mcontext.h:1.4 src/sys/arch/riscv/include/mcontext.h:1.5
--- src/sys/arch/riscv/include/mcontext.h:1.4	Wed Apr  1 21:55:33 2015
+++ src/sys/arch/riscv/include/mcontext.h	Thu Feb 15 15:53:56 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: mcontext.h,v 1.4 2015/04/01 21:55:33 matt Exp $ */
+/* $NetBSD: mcontext.h,v 1.5 2018/02/15 15:53:56 kamil Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -118,6 +118,7 @@ typedef struct {
 #define	_UC_TLSBASE	0x00080000	/* see <sys/ucontext.h> */
 
 #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_SP])
+#define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_S0])
 #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
 #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_RV])
 

Index: src/sys/arch/sh3/include/mcontext.h
diff -u src/sys/arch/sh3/include/mcontext.h:1.10 src/sys/arch/sh3/include/mcontext.h:1.11
--- src/sys/arch/sh3/include/mcontext.h:1.10	Wed Sep 12 02:00:54 2012
+++ src/sys/arch/sh3/include/mcontext.h	Thu Feb 15 15:53:57 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.10 2012/09/12 02:00:54 manu Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.11 2018/02/15 15:53:57 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -82,6 +82,7 @@ typedef struct {
 } mcontext_t;
 
 #define	_UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_SP])
+#define	_UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_R14])
 #define	_UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
 #define	_UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_R0])
 

Index: src/sys/arch/sparc/include/mcontext.h
diff -u src/sys/arch/sparc/include/mcontext.h:1.13 src/sys/arch/sparc/include/mcontext.h:1.14
--- src/sys/arch/sparc/include/mcontext.h:1.13	Wed Sep 12 02:00:54 2012
+++ src/sys/arch/sparc/include/mcontext.h	Thu Feb 15 15:53:57 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.13 2012/09/12 02:00:54 manu Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.14 2018/02/15 15:53:57 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -146,11 +146,14 @@ typedef struct {
 #ifdef __arch64__
 #define _UC_MACHINE_PAD	8		/* Padding appended to ucontext_t */
 #define	_UC_MACHINE_SP(uc)	(((uc)->uc_mcontext.__gregs[_REG_O6])+0x7ff)
+#define	_UC_MACHINE_FP(uc)	(((uc)->uc_mcontext.__gregs[_REG_O6])+0x80e)
 #define _UC_MACHINE32_PAD	43	/* compat_netbsd32 variant */
 #define	_UC_MACHINE32_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_O6])
+#define	_UC_MACHINE32_FP(uc)	(((uc)->uc_mcontext.__gregs[_REG_O6])+0xf)
 #else
 #define _UC_MACHINE_PAD	43		/* Padding appended to ucontext_t */
 #define	_UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_O6])
+#define	_UC_MACHINE_FP(uc)	(((uc)->uc_mcontext.__gregs[_REG_O6])+0xf)
 #endif
 #define	_UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
 #define	_UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_O0])

Index: src/sys/arch/vax/include/mcontext.h
diff -u src/sys/arch/vax/include/mcontext.h:1.8 src/sys/arch/vax/include/mcontext.h:1.9
--- src/sys/arch/vax/include/mcontext.h:1.8	Thu Feb  2 18:32:16 2012
+++ src/sys/arch/vax/include/mcontext.h	Thu Feb 15 15:53:57 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.8 2012/02/02 18:32:16 matt Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.9 2018/02/15 15:53:57 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -68,6 +68,7 @@ typedef struct {
 #define _UC_TLSBASE	0x00080000
 
 #define	_UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_SP])
+#define	_UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_FP])
 #define	_UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
 #define	_UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_R0])
 

Reply via email to