Module Name:    src
Committed By:   jakllsch
Date:           Thu Apr 23 23:22:41 UTC 2020

Modified Files:
        src/sys/arch/aarch64/include: profile.h
        src/sys/arch/arm/include: asm.h

Log Message:
Fix userland gprof profiling on aarch64.

Adjusts _PROF_PROLOGUE to match OpenBSD; reworks our MCOUNT to retrieve
frompc placed on stack by the prologue, and to streamline sp manipulation
when preserving argument registers.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/aarch64/include/profile.h
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/arm/include/asm.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/profile.h
diff -u src/sys/arch/aarch64/include/profile.h:1.1 src/sys/arch/aarch64/include/profile.h:1.2
--- src/sys/arch/aarch64/include/profile.h:1.1	Sun Aug 10 05:47:38 2014
+++ src/sys/arch/aarch64/include/profile.h	Thu Apr 23 23:22:41 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: profile.h,v 1.1 2014/08/10 05:47:38 matt Exp $ */
+/* $NetBSD: profile.h,v 1.2 2020/04/23 23:22:41 jakllsch Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -51,20 +51,18 @@
 	/*								\
 	 * Preserve registers that are trashed during mcount		\
 	 */								\
-	__asm("sub	sp, sp, #80");					\
-	__asm("stp	x29, x30, [sp, #64]");				\
-	__asm("add	x29, sp, #64");					\
-	__asm("stp	x0, x1, [x29, #0]");				\
-	__asm("stp	x2, x3, [x29, #16]");				\
-	__asm("stp	x4, x5, [x29, #32]");				\
-	__asm("stp	x6, x7, [x29, #48]");				\
+	__asm("stp	x29, x30, [sp, #-80]!");			\
+	__asm("stp	x0, x1, [sp, #16]");				\
+	__asm("stp	x2, x3, [sp, #32]");				\
+	__asm("stp	x4, x5, [sp, #48]");				\
+	__asm("stp	x6, x7, [sp, #64]");				\
 	/*								\
 	 * find the return address for mcount,				\
 	 * and the return address for mcount's caller.			\
 	 *								\
 	 * frompcindex = pc pushed by call into self.			\
 	 */								\
-	__asm("mov	x0, x19");					\
+	__asm("ldr	x0, [x29, #8]");				\
 	/*								\
 	 * selfpc = pc pushed by mcount call				\
 	 */								\
@@ -76,12 +74,11 @@
 	/*								\
 	 * Restore registers that were trashed during mcount		\
 	 */								\
-	__asm("ldp	x0, x1, [x29, #0]");				\
-	__asm("ldp	x2, x3, [x29, #16]");				\
-	__asm("ldp	x4, x5, [x29, #32]");				\
-	__asm("ldp	x6, x7, [x29, #48]");				\
-	__asm("ldp	x29, x30, [x29, #64]");				\
-	__asm("add	sp, sp, #80");					\
+	__asm("ldp	x0, x1, [sp, #16]");				\
+	__asm("ldp	x2, x3, [sp, #32]");				\
+	__asm("ldp	x4, x5, [sp, #48]");				\
+	__asm("ldp	x6, x7, [sp, #64]");				\
+	__asm("ldp	x29, x30, [sp], #80");				\
 	__asm("ret");							\
 	__asm(".size	" MCOUNT_ASM_NAME ", .-" MCOUNT_ASM_NAME);
 

Index: src/sys/arch/arm/include/asm.h
diff -u src/sys/arch/arm/include/asm.h:1.33 src/sys/arch/arm/include/asm.h:1.34
--- src/sys/arch/arm/include/asm.h:1.33	Tue Apr 21 11:35:02 2020
+++ src/sys/arch/arm/include/asm.h	Thu Apr 23 23:22:41 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: asm.h,v 1.33 2020/04/21 11:35:02 joerg Exp $	*/
+/*	$NetBSD: asm.h,v 1.34 2020/04/23 23:22:41 jakllsch Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -145,7 +145,10 @@
 
 #ifdef GPROF
 # define _PROF_PROLOGUE	\
-	mov x9, x30; bl __mcount
+	stp	x29, x30, [sp, #-16]!;	\
+	mov	fp, sp;			\
+	bl	__mcount; 		\
+	ldp	x29, x30, [sp], #16;
 #else
 # define _PROF_PROLOGUE
 #endif

Reply via email to