diff --git a/gdb/arch/ppc-linux-common.c b/gdb/arch/ppc-linux-common.c
index 87ccc42cae..45da105de6 100644
--- a/gdb/arch/ppc-linux-common.c
+++ b/gdb/arch/ppc-linux-common.c
@@ -31,7 +31,7 @@
 #endif
 
 bool
-ppc_linux_has_isa205 (unsigned long hwcap)
+ppc_linux_has_isa205 (CORE_ADDR hwcap)
 {
   /* Power ISA 2.05 (implemented by Power 6 and newer processors)
      increases the FPSCR from 32 bits to 64 bits.  Even though Power 7
diff --git a/gdb/arch/ppc-linux-common.h b/gdb/arch/ppc-linux-common.h
index 798781cbf7..2f535e801d 100644
--- a/gdb/arch/ppc-linux-common.h
+++ b/gdb/arch/ppc-linux-common.h
@@ -32,7 +32,7 @@ struct target_desc;
 #define PPC_LINUX_SIZEOF_VSXREGSET 256
 
 /* Check if the hwcap auxv entry indicates that isa205 is supported.  */
-bool ppc_linux_has_isa205 (unsigned long hwcap);
+bool ppc_linux_has_isa205 (CORE_ADDR hwcap);
 
 /* Features used to determine the target description.  */
 struct ppc_linux_features
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
index 0f7dd4c8e2..eb21f91c13 100644
--- a/gdb/ppc-linux-nat.c
+++ b/gdb/ppc-linux-nat.c
@@ -1165,15 +1165,15 @@ store_ppc_registers (const struct regcache *regcache, int tid)
 }
 
 /* Fetch the AT_HWCAP entry from the aux vector.  */
-static unsigned long
+static CORE_ADDR
 ppc_linux_get_hwcap (void)
 {
   CORE_ADDR field;
 
-  if (target_auxv_search (target_stack, AT_HWCAP, &field))
-    return (unsigned long) field;
+  if (target_auxv_search (target_stack, AT_HWCAP, &field) != 1)
+    return 0;
 
-  return 0;
+  return field;
 }
 
 /* The cached DABR value, to install in new threads.
@@ -2236,7 +2236,7 @@ ppc_linux_nat_target::read_description ()
 
   features.wordsize = ppc_linux_target_wordsize (tid);
 
-  unsigned long hwcap = ppc_linux_get_hwcap ();
+  CORE_ADDR hwcap = ppc_linux_get_hwcap ();
 
   if (have_ptrace_getsetvsxregs
       && (hwcap & PPC_FEATURE_HAS_VSX))
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
index 293353a878..5716f82810 100644
--- a/gdb/ppc-linux-tdep.c
+++ b/gdb/ppc-linux-tdep.c
@@ -1058,6 +1058,13 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch,
   if (vsx)
     features.vsx = true;
 
+  CORE_ADDR hwcap;
+
+  if (target_auxv_search (target, AT_HWCAP, &hwcap) != 1)
+    hwcap = 0;
+
+  features.isa205 = ppc_linux_has_isa205 (hwcap);
+
   return ppc_linux_match_description (features);
 }
 
diff --git a/gdb/testsuite/gdb.arch/powerpc-fpscr-gcore.exp b/gdb/testsuite/gdb.arch/powerpc-fpscr-gcore.exp
new file mode 100644
index 0000000000..d5db5320b6
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/powerpc-fpscr-gcore.exp
@@ -0,0 +1,93 @@
+# Copyright (C) 2018 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+# This tests checks that generating and loading a core file preserves
+# the correct FPSCR size.
+
+if {![istarget "powerpc*-*-linux*"]} then {
+    verbose "Skipping PowerPC test for corefiles with FPSCR."
+    return
+}
+
+standard_testfile .c
+
+set gen_src [standard_output_file $srcfile]
+
+gdb_produce_source $gen_src {
+	int main() {
+	    return 0;
+	}
+}
+
+if {[build_executable "compile" $binfile $gen_src] == -1} {
+    return -1
+}
+
+clean_restart $binfile
+
+if ![runto_main] then {
+    fail "could not run to main"
+    return -1
+}
+
+# Check if our target has FPSCR
+proc check_fpscr_access {} {
+    global gdb_prompt
+
+    set test "fpscr register access"
+    gdb_test_multiple "info reg fpscr" "$test" {
+	-re "Invalid register.*\r\n$gdb_prompt $" {
+	    unsupported "$test"
+	    return 0
+	}
+	-re "\r\nfpscr.*\r\n$gdb_prompt $" {
+	    pass "$test"
+	    return 1
+	}
+    }
+    return 0
+}
+
+if { ![check_fpscr_access] } {
+    return -1
+}
+
+set fpscr_size_process [get_integer_valueof "sizeof(\$fpscr)" -1]
+
+set core_filename [standard_output_file "$testfile.core"]
+set core_generated [gdb_gcore_cmd "$core_filename" "generate core file"]
+
+if { !$core_generated } {
+    return -1
+}
+
+clean_restart
+
+set core_loaded [gdb_core_cmd "$core_filename" "load core file"]
+
+if { $core_loaded != 1 } {
+    return -1
+}
+
+set fpscr_size_corefile [get_integer_valueof "sizeof(\$fpscr)" -2]
+
+set test "fpscr size matches"
+if {$fpscr_size_process == $fpscr_size_corefile} {
+    pass $test
+} else {
+    fail $test
+}
