Floating Point Exception on 64 bit POWER

Bug #1821758 reported by Simon Richter
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
KiCad
Expired
Undecided
Unassigned

Bug Description

We've had an user report pcbnew crashing with a floating point exception on 64 bit little endian POWER:

Stack Trace:

Thread 1 "pcbnew" received signal SIGFPE, Arithmetic exception.
__libc_femergeenv_ppc (new_mask=18446744073709031423, old_mask=18446744073709551360, envp=<synthetic pointer>) at ../sysdeps/powerpc/fpu/fenv_private.h:120
120 ../sysdeps/powerpc/fpu/fenv_private.h: No such file or directory.
(gdb) bt
#0 0x00007ffff6c04fbc in __libc_femergeenv_ppc (new_mask=18446744073709031423, old_mask=18446744073709551360, envp=<synthetic pointer>) at ../sysdeps/powerpc/fpu/fenv_private.h:120
#1 0x00007ffff6c04fbc in libc_feresetround_ppc (envp=<synthetic pointer>) at ../sysdeps/powerpc/fpu/fenv_private.h:135
#2 0x00007ffff6c04fbc in libc_feresetround_ppc_ctx (ctx=<optimized out>) at ../sysdeps/powerpc/fpu/fenv_private.h:212
#3 0x00007ffff6c04fbc in __sincos (x=<optimized out>, sinx=0x1026f9558, cosx=0x1026f9550) at ../sysdeps/ieee754/dbl-64/s_sincos.c:36
#4 0x00007ffff5b1112c in () at /usr/lib/powerpc64le-linux-gnu/libcairo.so.2
#5 0x00007ffff5b00604 in () at /usr/lib/powerpc64le-linux-gnu/libcairo.so.2
#6 0x00007ffff5b55954 in () at /usr/lib/powerpc64le-linux-gnu/libcairo.so.2
#7 0x00007ffff5ac2a58 in () at /usr/lib/powerpc64le-linux-gnu/libcairo.so.2
#8 0x00007ffff5b8da60 in () at /usr/lib/powerpc64le-linux-gnu/libcairo.so.2
#9 0x00007ffff5b47fb4 in () at /usr/lib/powerpc64le-linux-gnu/libcairo.so.2
#10 0x00007ffff5ad0654 in () at /usr/lib/powerpc64le-linux-gnu/libcairo.so.2
#11 0x00007ffff5ac5b9c in () at /usr/lib/powerpc64le-linux-gnu/libcairo.so.2
#12 0x00007ffff5b5ee34 in cairo_stroke () at /usr/lib/powerpc64le-linux-gnu/libcairo.so.2
#13 0x00007ffff612a958 in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#14 0x00007ffff6344230 in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#15 0x00007ffff633fdd8 in gtk_render_handle () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#16 0x00007ffff762e1ec in wxStatusBar::OnPaint(wxPaintEvent&) () at /usr/lib/powerpc64le-linux-gnu/libwx_gtk3u_core-3.0.so.0
#17 0x00007ffff6f9b434 in wxAppConsoleBase::CallEventHandler(wxEvtHandler*, wxEventFunctor&, wxEvent&) const () at /usr/lib/powerpc64le-linux-gnu/libwx_baseu-3.0.so.0
#18 0x00007ffff71a5220 in wxEvtHandler::ProcessEventIfMatchesId(wxEventTableEntryBase const&, wxEvtHandler*, wxEvent&) () at /usr/lib/powerpc64le-linux-gnu/libwx_baseu-3.0.so.0
#19 0x00007ffff71a543c in wxEventHashTable::HandleEvent(wxEvent&, wxEvtHandler*) () at /usr/lib/powerpc64le-linux-gnu/libwx_baseu-3.0.so.0
#20 0x00007ffff71a5d5c in wxEvtHandler::TryHereOnly(wxEvent&) () at /usr/lib/powerpc64le-linux-gnu/libwx_baseu-3.0.so.0
#21 0x00007ffff71a5e9c in wxEvtHandler::ProcessEventLocally(wxEvent&) () at /usr/lib/powerpc64le-linux-gnu/libwx_baseu-3.0.so.0
#22 0x00007ffff71a60a8 in wxEvtHandler::ProcessEvent(wxEvent&) () at /usr/lib/powerpc64le-linux-gnu/libwx_baseu-3.0.so.0
#23 0x00007ffff71a5a1c in wxEvtHandler::SafelyProcessEvent(wxEvent&) () at /usr/lib/powerpc64le-linux-gnu/libwx_baseu-3.0.so.0
#24 0x00007ffff78705dc in wxWindowBase::HandleWindowEvent(wxEvent&) const () at /usr/lib/powerpc64le-linux-gnu/libwx_gtk3u_core-3.0.so.0
#25 0x00007ffff75f4850 in wxWindow::GTKSendPaintEvents(_cairo*) () at /usr/lib/powerpc64le-linux-gnu/libwx_gtk3u_core-3.0.so.0
#26 0x00007ffff75f4e74 in () at /usr/lib/powerpc64le-linux-gnu/libwx_gtk3u_core-3.0.so.0
#27 0x00007ffff651f2ac in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#28 0x00007ffff648f6c8 in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#29 0x00007ffff5d04e20 in g_closure_invoke () at /usr/lib/powerpc64le-linux-gnu/libgobject-2.0.so.0
#30 0x00007ffff5d21c78 in () at /usr/lib/powerpc64le-linux-gnu/libgobject-2.0.so.0
#31 0x00007ffff5d2d9e4 in g_signal_emit_valist () at /usr/lib/powerpc64le-linux-gnu/libgobject-2.0.so.0
#32 0x00007ffff5d2e6c0 in g_signal_emit () at /usr/lib/powerpc64le-linux-gnu/libgobject-2.0.so.0
#33 0x00007ffff64a62dc in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#34 0x00007ffff6113150 in gtk_container_propagate_draw () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#35 0x00007ffff61132ac in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#36 0x00007ffff608fb24 in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#37 0x00007ffff611bc84 in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#38 0x00007ffff6125690 in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#39 0x00007ffff6091ec0 in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#40 0x00007ffff64a60b8 in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#41 0x00007ffff6113150 in gtk_container_propagate_draw () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#42 0x00007ffff61132ac in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#43 0x00007ffff64bb7a0 in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#44 0x00007ffff64a60b8 in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#45 0x00007ffff64b407c in () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#46 0x00007ffff627d538 in gtk_main_do_event () at /usr/lib/powerpc64le-linux-gnu/libgtk-3.so.0
#47 0x00007ffff5dc5e18 in () at /usr/lib/powerpc64le-linux-gnu/libgdk-3.so.0
#48 0x00007ffff5de3e3c in () at /usr/lib/powerpc64le-linux-gnu/libgdk-3.so.0
#49 0x00007ffff5dfaf58 in () at /usr/lib/powerpc64le-linux-gnu/libgdk-3.so.0
#50 0x00007ffff5de5f24 in () at /usr/lib/powerpc64le-linux-gnu/libgdk-3.so.0
#51 0x00007ffff5de65bc in gdk_window_process_updates () at /usr/lib/powerpc64le-linux-gnu/libgdk-3.so.0
#52 0x00007ffff75eb90c in wxWindow::Update() () at /usr/lib/powerpc64le-linux-gnu/libwx_gtk3u_core-3.0.so.0
#53 0x00007ffff762bb78 in wxStatusBar::DoUpdateStatusText(int) () at /usr/lib/powerpc64le-linux-gnu/libwx_gtk3u_core-3.0.so.0
#54 0x00007ffff7834d40 in wxStatusBarBase::SetStatusText(wxString const&, int) () at /usr/lib/powerpc64le-linux-gnu/libwx_gtk3u_core-3.0.so.0
#55 0x00007ffff775f3bc in wxFrameBase::SetStatusText(wxString const&, int) () at /usr/lib/powerpc64le-linux-gnu/libwx_gtk3u_core-3.0.so.0
#56 0x00007ffff2aa1814 in EDA_DRAW_FRAME::DisplayToolMsg(wxString const&) (this=0x1018e5ab0, msg=...) at /home/hexo/src/kicad-source-mirror/common/legacy_wx/eda_draw_frame.cpp:624
#57 0x00007ffff2aa1cf4 in EDA_DRAW_FRAME::SetToolID(int, int, wxString const&) (this=0x1018e5ab0, aId=6419, aCursor=13, aToolMsg=...) at /home/hexo/src/kicad-source-mirror/common/legacy_wx/eda_draw_frame.cpp:672
#58 0x00007ffff2836f60 in PCB_BASE_FRAME::SetToolID(int, int, wxString const&) (this=0x1018e5ab0, aId=6419, aCursor=13, aToolMsg=...) at /home/hexo/src/kicad-source-mirror/pcbnew/pcb_base_frame.cpp:801
#59 0x00007ffff29c2890 in ROUTER_TOOL::RouteSingleTrace(TOOL_EVENT const&) (this=0x1047fb800, aEvent=...) at /home/hexo/src/kicad-source-mirror/pcbnew/router/router_tool.cpp:914
#60 0x00007ffff29cdb30 in std::__invoke_impl<int, int (ROUTER_TOOL::*&)(TOOL_EVENT const&), ROUTER_TOOL*&, TOOL_EVENT const&>(std::__invoke_memfun_deref, int (ROUTER_TOOL::*&)(TOOL_EVENT const&), ROUTER_TOOL*&, TOOL_EVENT const&) (__f=
    @0x102442090: (int (ROUTER_TOOL::*)(class ROUTER_TOOL * const, const class TOOL_EVENT &)) 0x7ffff29c27d0 <ROUTER_TOOL::RouteSingleTrace(TOOL_EVENT const&)>, __t=@0x1024420a0: 0x1047fb800, __args#0=...) at /usr/include/c++/8/bits/invoke.h:73
#61 0x00007ffff29cd8e0 in std::__invoke<int (ROUTER_TOOL::*&)(TOOL_EVENT const&), ROUTER_TOOL*&, TOOL_EVENT const&>(int (ROUTER_TOOL::*&)(TOOL_EVENT const&), ROUTER_TOOL*&, TOOL_EVENT const&) (__fn=
    @0x102442090: (int (ROUTER_TOOL::*)(class ROUTER_TOOL * const, const class TOOL_EVENT &)) 0x7ffff29c27d0 <ROUTER_TOOL::RouteSingleTrace(TOOL_EVENT const&)>, __args#0=@0x1024420a0: 0x1047fb800, __args#1=...) at /usr/include/c++/8/bits/invoke.h:95
#62 0x00007ffff29cd4c4 in std::_Bind<int (ROUTER_TOOL::*(ROUTER_TOOL*, std::_Placeholder<1>))(TOOL_EVENT const&)>::__call<int, TOOL_EVENT const&, 0ul, 1ul>(std::tuple<TOOL_EVENT const&>&&, std::_Index_tuple<0ul, 1ul>) (this=0x102442090, __args=...)
    at /usr/include/c++/8/functional:400
#63 0x00007ffff29ccee0 in std::_Bind<int (ROUTER_TOOL::*(ROUTER_TOOL*, std::_Placeholder<1>))(TOOL_EVENT const&)>::operator()<TOOL_EVENT const&, int>(TOOL_EVENT const&) (this=0x102442090, __args#0=...) at /usr/include/c++/8/functional:484
--Type <RET> for more, q to quit, c to continue without paging--
#64 0x00007ffff29cc688 in std::_Function_handler<int (TOOL_EVENT const&), std::_Bind<int (ROUTER_TOOL::*(ROUTER_TOOL*, std::_Placeholder<1>))(TOOL_EVENT const&)> >::_M_invoke(std::_Any_data const&, TOOL_EVENT const&) (__functor=..., __args#0=...)
    at /usr/include/c++/8/bits/std_function.h:282
#65 0x00007ffff2ca92cc in std::function<int (TOOL_EVENT const&)>::operator()(TOOL_EVENT const&) const (this=0x1024a0dd8, __args#0=...) at /usr/include/c++/8/bits/std_function.h:687
#66 0x00007ffff2ca35c4 in COROUTINE<int, TOOL_EVENT const&>::callerStub(long) (aData=140737488340616) at /home/hexo/src/kicad-source-mirror/include/tool/coroutine.h:331
#67 0x00007ffff2d2e958 in make_fcontext () at /home/hexo/src/kicad-source-mirror/build/debug/pcbnew/_pcbnew.kiface

The sincos function most likely comes from glibc 2.28, as found in

http://ports.ubuntu.com/ubuntu-ports/pool/main/g/glibc/libc6_2.28-0ubuntu1_ppc64el.deb

Matching up address offsets in pages, the offending instruction is

   64fbc: 8e 05 fe ff mtfsf 255,f0,1,0

The mtfsf instruction can only raise FPSCR[VXSOFT], i.e. a user exception, so this is an error path in the "sincos" function. According to the manpage, the only error condition would be passing positive or negative infinity.

This happens during rendering a gtk widget from a tool context, so my suspicion is that either the widget isn't properly initialized yet, so a divisor becomes zero, or the context switch does something unexpected to the FPU context so gtk3 or cairo end up miscalculating a value.

Tags: pcbnew gtk3
Revision history for this message
Wayne Stambaugh (stambaughw) wrote :

I don't know anyone with a PPC machine that can help us out debugging this. The best we could do is provide a patch to ensure a divide by zero cannot happen and have someone with a ppc machine test it for us.

Changed in kicad:
status: New → Incomplete
Revision history for this message
Simon Richter (sjr) wrote :

I have a 64 bit POWER machine, although it's not currently set up.

Default behaviour on Linux is to never raise SIGFPE, so apparently either some code enabled FP exceptions, or this happened during the context switch. We might be able to reproduce this error on Intel as well if we enable floating point traps.

Revision history for this message
Launchpad Janitor (janitor) wrote :

[Expired for KiCad because there has been no activity for 60 days.]

Changed in kicad:
status: Incomplete → Expired
Revision history for this message
Simon Richter (sjr) wrote :

Hm, I'd rather not ignore this.

My feeling is that there are two bugs here: an error in FPE setup on POWER, and some FP operation raising an exception that is ignored on all other platforms.

My proposal would be to enable FPEs on all platforms in Debug builds.

Revision history for this message
Seth Hillbrand (sethh) wrote :

I'm pretty sure they are. I just fixed an Eagle bug that was caused by FP divide by 0. So at least linux x86 builds have them enabled by default. This might be changed by packagers, of course.

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.