Floating-point exception handler receives empty Data-Exception Code in Floating Point Control register

Bug #1548414 reported by bugproxy
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
linux (Ubuntu)
Fix Released
High
Tim Gardner
Xenial
Fix Released
High
Tim Gardner

Bug Description

== Comment: #0 - Alexander Efremkin <email address hidden> - 2016-02-17 12:18:14 ==
With a C program sets FPE handler and triggers an FPE exception, it expects that machine-dependent context data, which is passed to the handler, will contain sensible values.

In this scenario, however, FPC register was zero and contained no DXC (Data-Exception Code) indication:

#include <stdio.h>
#include <string.h>
#include <signal.h>

void trapFunction() {
   asm volatile ("lhi %r1,0\n\t"
                 "cit %r1,0,8\n\t");
}

static void sigFPE_handler(int signal, siginfo_t *info, void *context) {
   ucontext_t *uc = context;
   mcontext_t mc = uc->uc_mcontext;
   fpregset_t fpregs = mc.fpregs;
   unsigned int fpc = fpregs.fpc;

   printf("received signal!\n");
   printf("fpc: %08x\n", fpc );
}

int main() {
   struct sigaction action;
   memset(&action, '\0', sizeof(action));

   printf("registering signal handler\n");

   action.sa_flags |= SA_SIGINFO;
   action.sa_sigaction = sigFPE_handler;
   if (sigaction(SIGFPE, &action, NULL))
      printf("error calling sigaction\n");

   printf("firing trap\n");
   trapFunction();
   return 0;
}

This program prints "fpc: 00000000", but the expected output is "fpc: 0000ff00"..

The IBM Java team has encountered test failures around the use of trap instructions; Linux on z Distribution Test reproduced the issue on the following system:

z13 LPAR
Ubuntu 16.04
Kernel 4.4.0-4-generic
gcc (Ubuntu 5.3.1-8ubuntu2) 5.3.1 20160205
libc6 2.21-0ubuntu5

Also, similar issue has been found during test of SIMD (vector) instructions, FPC contents was also zero, whereas it expected at least an exception mask and vector-defined DXC.

bugproxy (bugproxy)
tags: added: architecture-s39064 bugnameltc-137317 severity-critical targetmilestone-inin1604
Changed in ubuntu:
assignee: nobody → Skipper Bug Screeners (skipper-screen-team)
Revision history for this message
Dimitri John Ledkov (xnox) wrote :

Replying via email.

Changed in ubuntu:
status: New → Incomplete
Gary Gaydos (gmgaydos)
affects: ubuntu → linux (Ubuntu)
Revision history for this message
dann frazier (dannf) wrote :

From IBM:

This is kernel problem in the signal
handling. An upstream kernel patch has been made and is currently on
the s390 maintainers git tree on the fixes branch:
  "s390/fpu: signals vs. floating point control register"

  http://git.kernel.org/cgit/linux/kernel/git/s390/linux.git/log/?h=fixes

Changed in linux (Ubuntu):
status: Incomplete → Triaged
assignee: Skipper Bug Screeners (skipper-screen-team) → Andy Whitcroft (apw)
importance: Undecided → High
Revision history for this message
Tim Gardner (timg-tpi) wrote :

Cherry-picked 1b17cb796f5d40ffa239c6926385abd83a77a49b s390/fpu: signals vs. floating point control register

Changed in linux (Ubuntu Xenial):
assignee: Andy Whitcroft (apw) → Tim Gardner (timg-tpi)
status: Triaged → Fix Committed
Revision history for this message
bugproxy (bugproxy) wrote : Comment bridged from LTC Bugzilla

------- Comment From <email address hidden> 2016-02-26 10:59 EDT-------
Problem fix is now upstream:

commit 1b17cb796f5d40ffa239c6926385abd83a77a49b
Author: Martin Schwidefsky <email address hidden>
Date: Fri Feb 19 15:29:05 2016 +0100

s390/fpu: signals vs. floating point control register
git commit 904818e2f229f3d94ec95f6932a6358c81e73d78
"s390/kernel: introduce fpu-internal.h with fpu helper functions"
introduced the fpregs_store / fp_regs_load helper. These function
fail to save and restore the floating pointer control registers.
The effect is that the FPC is not correctly handled on signal
delivery and signal return.
Cc: <email address hidden> # 4.4
Signed-off-by: Martin Schwidefsky <email address hidden>

Revision history for this message
Dimitri John Ledkov (xnox) wrote :

New kernel upload has entered xenial-proposed, and is being tested before migrating to release component

For full changelog see:

https://launchpad.net/ubuntu/+source/linux/4.4.0-9.24

Kernel release process workflow bug for this kernel is at:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1551319

To see progress of this kernel being released to xenial release component.

Highlights from the changelog:
  * s390x: correct restore of high gprs on signal return (LP: #1550468)
    - s390/compat: correct restore of high gprs on signal return
  * Floating-point exception handler receives empty Data-Exception Code in
    Floating Point Control register (LP: #1548414)
    - s390/fpu: signals vs. floating point control register
  * Various failures of kernel_security suite on Xenial kernel on s390x arch
    (LP: #1531327)
    - [config] s390x -- CONFIG_DEFAULT_MMAP_MIN_ADDR=65536

Revision history for this message
Launchpad Janitor (janitor) wrote :
Download full text (7.6 KiB)

This bug was fixed in the package linux - 4.4.0-9.24

---------------
linux (4.4.0-9.24) xenial; urgency=low

  [ Tim Gardner ]

  * Release Tracking Bug
    - LP: #1551319

  * AppArmor logs denial for when the device path is ENOENT (LP: #1482943)
    - SAUCE: apparmor: fix log of apparmor audit message when kern_path() fails

  * BUG: unable to handle kernel NULL pointer dereference (aa_label_merge) (LP:
    #1448912)
    - SAUCE: apparmor: Fix: insert race between label_update and label_merge
    - SAUCE: apparmor: Fix: ensure aa_get_newest will trip debugging if the
      replacedby is not setup
    - SAUCE: apparmor: Fix: label merge handling of marking unconfined and stale
    - SAUCE: apparmor: Fix: refcount race between locating in labelset and get
    - SAUCE: apparmor: Fix: ensure new labels resulting from merge have a
      replacedby
    - SAUCE: apparmor: Fix: label_vec_merge insertion
    - SAUCE: apparmor: Fix: deadlock in aa_put_label() call chain
    - SAUCE: apparmor: Fix: add required locking of __aa_update_replacedby on
      merge path
    - SAUCE: apparmor: Fix: convert replacedby update to be protected by the
      labelset lock
    - SAUCE: apparmor: Fix: update replacedby allocation to take a gfp parameter

  * apparmor kernel BUG kills firefox (LP: #1430546)
    - SAUCE: apparmor: Disallow update of cred when then subjective != the
      objective cred
    - SAUCE: apparmor: rework retrieval of the current label in the profile update
      case

  * sleep from invalid context in aa_move_mount (LP: #1539349)
    - SAUCE: apparmor: fix sleep from invalid context

  * s390x: correct restore of high gprs on signal return (LP: #1550468)
    - s390/compat: correct restore of high gprs on signal return

  * missing SMAP support (LP: #1550517)
    - x86/entry/compat: Add missing CLAC to entry_INT80_32

  * Floating-point exception handler receives empty Data-Exception Code in
    Floating Point Control register (LP: #1548414)
    - s390/fpu: signals vs. floating point control register

  * kvm fails to boot GNU Hurd kernels with 4.4 Xenial kernel (LP: #1550596)
    - KVM: x86: fix conversion of addresses to linear in 32-bit protected mode

  * Surelock GA2 SP1: capiredp01: cxl_init_adapter fails for CAPI devices
    0000:01:00.0 and 0005:01:00.0 after upgrading to 840.10 Platform firmware
    build fips840/b1208b_1604.840 (LP: #1532914)
    - cxl: Fix PSL timebase synchronization detection

  * [Feature]EDAC support for Knights Landing (LP: #1519631)
    - EDAC, sb_edac: Set fixed DIMM width on Xeon Knights Landing

  * Various failures of kernel_security suite on Xenial kernel on s390x arch
    (LP: #1531327)
    - [config] s390x -- CONFIG_DEFAULT_MMAP_MIN_ADDR=65536

  * Unable to install VirtualBox Guest Service in 15.04 (LP: #1434579)
    - [Config] Provides: virtualbox-guest-modules when appropriate

  * linux is missing provides for virtualbox-guest-modules [i386 amd64 x32] (LP:
    #1507588)
    - [Config] Provides: virtualbox-guest-modules when appropriate

  * Backport more recent driver for SKL, KBL and BXT graphics (LP: #1540390)
    - SAUCE: i915_bpo: Provide a backport driver for SKL, KBL & BXT graphics
    - SA...

Read more...

Changed in linux (Ubuntu Xenial):
status: Fix Committed → Fix Released
Revision history for this message
bugproxy (bugproxy) wrote :

------- Comment From <email address hidden> 2016-03-04 07:54 EDT-------
Verified on kernel 4.4.0-9 on a VM.

root@s3529003:~# uname -a
Linux s3529003 4.4.0-9-generic #24-Ubuntu SMP Mon Feb 29 19:30:59 UTC 2016 s390x s390x s390x GNU/Linux

root@s3529003:~# gcc-5 -o test test.c
root@s3529003:~# ./test
registering signal handler
firing trap
received signal!
fpc: 0000ff00

FPC is set correctly

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.