Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/mac68k/mac68k For GCC8, do not omit frame pointer f...



details:   https://anonhg.NetBSD.org/src/rev/93f3f84565bb
branches:  trunk
changeset: 1012081:93f3f84565bb
user:      rin <rin%NetBSD.org@localhost>
date:      Tue Jul 21 06:10:26 2020 +0000

description:
For GCC8, do not omit frame pointer for intr_dispatch() and via1_intr()
(-fomit-frame-pointer is enabled for -O and higher for GCC8).

This is required by rtclock_intr() which unwinds stack frame of caller!

XXXXXX
We need to get rid of this hackest hack for rtclock_intr(). This problem
was discussed back in 2014:

http://mail-index.netbsd.org/port-mac68k/2014/08/15/msg000595.html
http://mail-index.netbsd.org/port-mac68k/2014/08/17/msg000600.html
http://mail-index.netbsd.org/port-mac68k/2014/08/17/msg000601.html

However, unfortunately, the problem has been left untouched until today.

The patch attached in the third message works around the problem. But,
it adds hard-coded magic numbers to intr_dispatch() and via1_intr().
For real fix, we should probably reconsider whole interrupt handling.

Anyway, now kernel compiled by GCC8 works fine as far as I can see.

diffstat:

 sys/arch/mac68k/mac68k/intr.c   |  14 ++++++++++++--
 sys/arch/mac68k/mac68k/locore.s |   3 ++-
 sys/arch/mac68k/mac68k/via.c    |  14 ++++++++++++--
 3 files changed, 26 insertions(+), 5 deletions(-)

diffs (101 lines):

diff -r 849b9c7126f7 -r 93f3f84565bb sys/arch/mac68k/mac68k/intr.c
--- a/sys/arch/mac68k/mac68k/intr.c     Tue Jul 21 06:01:10 2020 +0000
+++ b/sys/arch/mac68k/mac68k/intr.c     Tue Jul 21 06:10:26 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: intr.c,v 1.30 2019/02/19 00:34:50 mrg Exp $    */
+/*     $NetBSD: intr.c,v 1.31 2020/07/21 06:10:26 rin Exp $    */
 
 /*-
  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.30 2019/02/19 00:34:50 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.31 2020/07/21 06:10:26 rin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -206,6 +206,13 @@
  *
  * XXX Note: see the warning in intr_establish()
  */
+#if __GNUC_PREREQ__(8, 0)
+/*
+ * XXX rtclock_intr() requires this for unwinding stack frame.
+ */
+#pragma GCC push_options
+#pragma GCC optimize "-fno-omit-frame-pointer"
+#endif
 void
 intr_dispatch(int evec)                /* format | vector offset */
 {
@@ -225,6 +232,9 @@
        (void)(*intr_func[ipl])(intr_arg[ipl]);
        idepth--;
 }
+#if __GNUC_PREREQ__(8, 0)
+#pragma GCC pop_options
+#endif
 
 /*
  * Default interrupt handler:  do nothing.
diff -r 849b9c7126f7 -r 93f3f84565bb sys/arch/mac68k/mac68k/locore.s
--- a/sys/arch/mac68k/mac68k/locore.s   Tue Jul 21 06:01:10 2020 +0000
+++ b/sys/arch/mac68k/mac68k/locore.s   Tue Jul 21 06:10:26 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: locore.s,v 1.172 2020/07/21 05:45:38 rin Exp $ */
+/*     $NetBSD: locore.s,v 1.173 2020/07/21 06:10:26 rin Exp $ */
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -794,6 +794,7 @@
        movw    _C_LABEL(ipl2psl_table)+IPL_CLOCK*2,%sr
                                        | raise SPL to splclock()
        movl    %a6@,%a1                | unwind to frame in intr_dispatch
+                                       | XXX FIXME
        lea     %a1@(28),%a1            | push pointer to interrupt frame
        movl    %a1,%sp@-                       | 28 = 16 for regs in intrhand,
                                        |    + 4 for args to intr_dispatch
diff -r 849b9c7126f7 -r 93f3f84565bb sys/arch/mac68k/mac68k/via.c
--- a/sys/arch/mac68k/mac68k/via.c      Tue Jul 21 06:01:10 2020 +0000
+++ b/sys/arch/mac68k/mac68k/via.c      Tue Jul 21 06:10:26 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: via.c,v 1.75 2005/12/11 12:18:03 christos Exp $        */
+/*     $NetBSD: via.c,v 1.76 2020/07/21 06:10:26 rin Exp $     */
 
 /*-
  * Copyright (C) 1993  Allen K. Briggs, Chris P. Caputo,
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: via.c,v 1.75 2005/12/11 12:18:03 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: via.c,v 1.76 2020/07/21 06:10:26 rin Exp $");
 
 #include "opt_mac68k.h"
 
@@ -239,6 +239,13 @@
                via_reg(VIA1, vBufA) &= ~DA1O_vSync;
 }
 
+#if __GNUC_PREREQ__(8, 0)
+/*
+ * XXX rtclock_intr() requires this for unwinding stack frame.
+ */
+#pragma GCC push_options
+#pragma GCC optimize "-fno-omit-frame-pointer"
+#endif
 void
 via1_intr(void *intr_arg)
 {
@@ -269,6 +276,9 @@
                ++bitnum;
        } while (intbits >= mask);
 }
+#if __GNUC_PREREQ__(8, 0)
+#pragma GCC pop_options
+#endif
 
 void
 via2_intr(void *intr_arg)



Home | Main Index | Thread Index | Old Index