Author: luporl
Date: Tue Jun 25 17:15:44 2019
New Revision: 349377
URL: https://svnweb.freebsd.org/changeset/base/349377

Log:
  [PowerPC64] Don't mark module data as static
  
  Fixes panic when loading ipfw.ko and if_epair.ko built with modern compiler.
  
  Similar to arm64 and riscv, when using a modern compiler (!gcc4.2), code
  generated tries to access data in the wrong location, causing kernel panic
  (data storage interrupt trap) when loading if_epair and ipfw.
  
  Issue was reproduced with kernel/module compiled using gcc8 and clang8. It
  affects both ELFv1 and ELFv2 ABI environments.
  
  PR:           232387
  Submitted by: alfredo.junior_eldorado.org.br
  Reported by:  Mark Millard
  Reviewed by:  jhibbits
  Differential Revision:        https://reviews.freebsd.org/D20461

Modified:
  head/sys/net/vnet.h
  head/sys/sys/pcpu.h

Modified: head/sys/net/vnet.h
==============================================================================
--- head/sys/net/vnet.h Tue Jun 25 17:00:53 2019        (r349376)
+++ head/sys/net/vnet.h Tue Jun 25 17:15:44 2019        (r349377)
@@ -273,7 +273,8 @@ extern struct sx vnet_sxlock;
 /* struct _hack is to stop this from being used with static data */
 #define        VNET_DEFINE(t, n)       \
     struct _hack; t VNET_NAME(n) __section(VNET_SETNAME) __used
-#if defined(KLD_MODULE) && (defined(__aarch64__) || defined(__riscv))
+#if defined(KLD_MODULE) && (defined(__aarch64__) || defined(__riscv) \
+               || defined(__powerpc64__))
 /*
  * As with DPCPU_DEFINE_STATIC we are unable to mark this data as static
  * in modules on some architectures.

Modified: head/sys/sys/pcpu.h
==============================================================================
--- head/sys/sys/pcpu.h Tue Jun 25 17:00:53 2019        (r349376)
+++ head/sys/sys/pcpu.h Tue Jun 25 17:15:44 2019        (r349377)
@@ -85,7 +85,8 @@ extern uintptr_t dpcpu_off[];
 /* struct _hack is to stop this from being used with the static keyword. */
 #define        DPCPU_DEFINE(t, n)      \
     struct _hack; t DPCPU_NAME(n) __section(DPCPU_SETNAME) __used
-#if defined(KLD_MODULE) && (defined(__aarch64__) || defined(__riscv))
+#if defined(KLD_MODULE) && (defined(__aarch64__) || defined(__riscv) \
+               || defined(__powerpc64__))
 /*
  * On some architectures the compiler will use PC-relative load to
  * find the address of DPCPU data with the static keyword. We then
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to