linux_dsm_epyc7002/arch/powerpc/kernel
Joseph Myers 640e922501 powerpc: fix exception clearing in e500 SPE float emulation
The e500 SPE floating-point emulation code clears existing exceptions
(__FPU_FPSCR &= ~FP_EX_MASK;) before ORing in the exceptions from the
emulated operation.  However, these exception bits are the "sticky",
cumulative exception bits, and should only be cleared by the user
program setting SPEFSCR, not implicitly by any floating-point
instruction (whether executed purely by the hardware or emulated).
The spurious clearing of these bits shows up as missing exceptions in
glibc testing.

Fixing this, however, is not as simple as just not clearing the bits,
because while the bits may be from previous floating-point operations
(in which case they should not be cleared), the processor can also set
the sticky bits itself before the interrupt for an exception occurs,
and this can happen in cases when IEEE 754 semantics are that the
sticky bit should not be set.  Specifically, the "invalid" sticky bit
is set in various cases with non-finite operands, where IEEE 754
semantics do not involve raising such an exception, and the
"underflow" sticky bit is set in cases of exact underflow, whereas
IEEE 754 semantics are that this flag is set only for inexact
underflow.  Thus, for correct emulation the kernel needs to know the
setting of these two sticky bits before the instruction being
emulated.

When a floating-point operation raises an exception, the kernel can
note the state of the sticky bits immediately afterwards.  Some
<fenv.h> functions that affect the state of these bits, such as
fesetenv and feholdexcept, need to use prctl with PR_GET_FPEXC and
PR_SET_FPEXC anyway, and so it is natural to record the state of those
bits during that call into the kernel and so avoid any need for a
separate call into the kernel to inform it of a change to those bits.
Thus, the interface I chose to use (in this patch and the glibc port)
is that one of those prctl calls must be made after any userspace
change to those sticky bits, other than through a floating-point
operation that traps into the kernel anyway.  feclearexcept and
fesetexceptflag duly make those calls, which would not be required
were it not for this issue.

The previous EGLIBC port, and the uClibc code copied from it, is
fundamentally broken as regards any use of prctl for floating-point
exceptions because it didn't use the PR_FP_EXC_SW_ENABLE bit in its
prctl calls (and did various worse things, such as passing a pointer
when prctl expected an integer).  If you avoid anything where prctl is
used, the clearing of sticky bits still means it will never give
anything approximating correct exception semantics with existing
kernels.  I don't believe the patch makes things any worse for
existing code that doesn't try to inform the kernel of changes to
sticky bits - such code may get incorrect exceptions in some cases,
but it would have done so anyway in other cases.

Signed-off-by: Joseph Myers <joseph@codesourcery.com>
Signed-off-by: Scott Wood <scottwood@freescale.com>
2014-01-07 18:32:21 -06:00
..
vdso32 powerpc/8xx: mfspr SPRN_TBRx in lieu of mftb/mftbu is not supported 2013-11-22 16:56:48 -06:00
vdso64 powerpc: Wrong DWARF CFI in the kernel vdso for little-endian / ELFv2 2013-11-21 09:19:23 +11:00
.gitignore
align.c powerpc: Enable Little Endian Alignment Handler for Float Pair Instructions 2013-10-30 16:01:23 +11:00
asm-offsets.c powerpc/book3s: handle machine check in Linux host. 2013-12-05 16:02:06 +11:00
audit.c
btext.c powerpc/btext: Fix CONFIG_PPC_EARLY_DEBUG_BOOTX on ppc32 2013-08-27 16:01:23 +10:00
cacheinfo.c powerpc: Make device tree accesses in cache info code endian safe 2013-08-14 15:33:27 +10:00
cacheinfo.h
clock.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
compat_audit.c
cpu_setup_6xx.S powerpc: Fix some 6xx/7xxx CPU setup functions 2011-02-07 12:57:11 +11:00
cpu_setup_44x.S powerpc/44x: Add support for the AMCC APM821xx SoC 2010-10-13 08:47:09 -04:00
cpu_setup_a2.S powerpc: Enforce usage of RA 0-R31 where possible 2012-07-10 19:18:35 +10:00
cpu_setup_fsl_booke.S powerpc/booke64: Add LRAT error exception handler 2014-01-07 18:15:29 -06:00
cpu_setup_pa6t.S
cpu_setup_power.S powerpc/book3s: Add flush_tlb operation in cpu_spec. 2013-12-05 16:04:38 +11:00
cpu_setup_ppc970.S powerpc, KVM: Split HVMODE_206 cpu feature bit into separate HV and architecture bits 2011-07-12 13:16:58 +03:00
cputable.c powerpc/book3s: Flush SLB/TLBs if we get SLB/TLB machine check errors on power8. 2013-12-05 16:04:40 +11:00
crash_dump.c powerpc: Fix endian issues in crash dump code 2013-12-13 15:48:39 +11:00
crash.c Disintegrate asm/system.h for PowerPC 2012-03-28 18:30:02 +01:00
dbell.c powerpc: Add accounting for Doorbell interrupts 2013-04-18 15:59:55 +10:00
dma-iommu.c powerpc/iommu: Update the generic code to use dynamic iommu page sizes 2013-12-30 14:17:19 +11:00
dma-swiotlb.c powerpc/swiotlb: Enable at early stage and disable if not necessary 2012-09-12 14:57:09 -05:00
dma.c powerpc/kernel: Remove uses of abs_to_virt() and virt_to_abs() 2012-09-05 15:19:30 +10:00
eeh_cache.c powerpc/eeh: Remove reference to PCI device 2013-07-24 14:18:46 +10:00
eeh_dev.c powerpc/eeh: Move common part to kernel directory 2013-06-20 17:05:35 +10:00
eeh_driver.c powerpc: Increase EEH recovery timeout for SR-IOV 2013-12-05 16:08:20 +11:00
eeh_event.c powerpc/eeh: More accurate log 2013-11-21 10:33:36 +11:00
eeh_pe.c powerpc/eeh: Don't use pci_dev during BAR restore 2013-07-24 14:18:49 +10:00
eeh_sysfs.c powerpc/eeh: Introdce flag to protect sysfs 2013-07-24 14:18:49 +10:00
eeh.c powerpc: Increase EEH recovery timeout for SR-IOV 2013-12-05 16:08:20 +11:00
entry_32.S powerpc/32bit:Store temporary result in r0 instead of r8 2013-06-01 08:29:27 +10:00
entry_64.S powerpc/book3s: Queue up and process delayed MCE events. 2013-12-05 16:05:21 +11:00
epapr_hcalls.S powerpc: Add paravirt idle loop for 64-bit Book-E 2013-03-13 14:19:36 -05:00
epapr_paravirt.c powerpc: add explicit OF includes 2013-10-09 20:04:11 -05:00
exceptions-64e.S powerpc/booke64: Add LRAT error exception handler 2014-01-07 18:15:29 -06:00
exceptions-64s.S powerpc: Fix "attempt to move .org backwards" error 2013-12-30 14:16:30 +11:00
fadump.c mm/ppc: use common help functions to free reserved pages 2013-04-29 15:54:30 -07:00
firmware.c powerpc: fix implicit use of cache.h in kernel/firmware.c 2011-10-31 19:30:41 -04:00
fpu.S powerpc: Don't corrupt user registers on 32-bit 2013-10-23 22:34:19 +11:00
fsl_booke_entry_mapping.S powerpc/fsl-booke: Fix address issue when using relocatable kernels 2010-07-11 11:04:08 -05:00
ftrace.c powerpc: Make ftrace endian-safe. 2013-10-11 16:53:26 +11:00
head_8xx.S powerpc/8xx: Fixing issue with CONFIG_PIN_TLB 2013-10-28 21:11:21 -05:00
head_32.S powerpc: Call do_page_fault() with interrupts off 2012-03-09 10:55:08 +11:00
head_40x.S powerpc: Remove the empty giveup_fpu() function on 32bit kernel 2013-08-14 14:59:50 +10:00
head_44x.S powerpc: Remove the empty giveup_fpu() function on 32bit kernel 2013-08-14 14:59:50 +10:00
head_64.S powerpc: Fix alignment of secondary cpu spin vars 2013-12-30 14:02:34 +11:00
head_booke.h powerpc: Fix interrupt range check on debug exception 2013-05-02 10:31:01 +10:00
head_fsl_booke.S powerpc/fsl-booke: Use common defines for SPE/FP interrupts numbers 2013-10-16 18:49:44 -05:00
hw_breakpoint.c powerpc/hw_brk: Fix off by one error when validating DAWR region end 2013-07-02 08:20:49 +10:00
ibmebus.c PPC: ibmebus: convert bus code to use bus_groups 2013-09-26 15:49:42 -07:00
idle_6xx.S powerpc: Use CURRENT_THREAD_INFO instead of open coded assembly 2012-07-11 14:18:22 +10:00
idle_book3e.S powerpc: Add paravirt idle loop for 64-bit Book-E 2013-03-13 14:19:36 -05:00
idle_e500.S powerpc: Use CURRENT_THREAD_INFO instead of open coded assembly 2012-07-11 14:18:22 +10:00
idle_power4.S powerpc: Use CURRENT_THREAD_INFO instead of open coded assembly 2012-07-11 14:18:22 +10:00
idle_power7.S powerpc/book3s: Return from interrupt if coming from evil context. 2013-12-05 16:04:36 +11:00
idle.c powerpc/idle: Convert use of typedef ctl_table to struct ctl_table 2013-07-01 11:10:35 +10:00
io-workarounds.c powerpc: Better split CONFIG_PPC_INDIRECT_PIO and CONFIG_PPC_INDIRECT_MMIO 2013-08-14 14:57:50 +10:00
io.c powerpc/powernv: Add PIO accessors for Power8 LPC bus 2013-08-14 14:58:08 +10:00
iomap.c powerpc: switch to GENERIC_PCI_IOMAP 2011-11-28 21:13:18 +02:00
iommu.c powerpc/iommu: Update the generic code to use dynamic iommu page sizes 2013-12-30 14:17:19 +11:00
irq.c powerpc: Make irq_stat.timers_irqs counting more specific 2013-12-02 14:14:50 +11:00
isa-bridge.c POWERPC: drivers: remove __dev* attributes. 2013-01-03 15:57:04 -08:00
jump_label.c powerpc: Fix build breakage in jump_label.c 2011-11-16 14:25:19 +11:00
kgdb.c powerpc/kgdb: use DEFINE_PER_CPU to allocate kgdb's thread_info 2013-10-18 18:38:10 -05:00
kprobes.c doc: typo on word accounting in kprobes.c in mutliple architectures 2013-10-14 15:46:39 +02:00
kvm_emul.S KVM: PPC: Not optimizing MSR_CE and MSR_ME with paravirt. 2012-05-30 11:43:11 +02:00
kvm.c mm: enhance free_reserved_area() to support poisoning memory with zero 2013-07-03 16:07:32 -07:00
l2cr_6xx.S Fix common misspellings 2011-03-31 11:26:23 -03:00
legacy_serial.c powerpc/legacy_serial: Fix incorrect placement of __initdata tag 2013-10-11 16:48:59 +11:00
machine_kexec_32.c treewide: convert uses of ATTRIB_NORETURN to __noreturn 2012-01-12 20:13:03 -08:00
machine_kexec_64.c powerpc/kexec: kexec_sequence() is in misc_64.S 2013-10-30 16:02:18 +11:00
machine_kexec.c powerpc: Fix up the kdump base cap to 128M 2013-12-10 11:28:39 +11:00
Makefile powerpc/book3s: Decode and save machine check event. 2013-12-05 16:05:20 +11:00
mce_power.c powerpc: Fix endian issues in power7/8 machine check handler 2013-12-30 14:51:09 +11:00
mce.c powerpc/powernv: Machine check exception handling. 2013-12-05 16:06:06 +11:00
misc_32.S powerpc: purge all the prefetched instructions for the coherent icache flush 2013-12-02 14:13:47 +11:00
misc_64.S Merge branch 'merge' into next 2013-12-30 15:19:31 +11:00
misc.S powerpc: switch to generic sys_execve()/kernel_execve() 2012-09-30 23:35:51 -04:00
module_32.c powerpc: Move local setup.h declarations to arch includes 2013-10-30 16:00:31 +11:00
module_64.c powerpc: Move local setup.h declarations to arch includes 2013-10-30 16:00:31 +11:00
module.c powerpc: Move local setup.h declarations to arch includes 2013-10-30 16:00:31 +11:00
msi.c
nvram_64.c arch/powerpc/kernel: Use %12.12s instead of %12s to avoid memory overflow 2013-11-25 11:50:57 +11:00
of_platform.c powerpc/eeh: Fix crash when adding a device in a slot with DDW 2013-01-10 17:01:58 +11:00
paca.c powerpc: Dynamically allocate slb_shadow from memblock 2013-12-09 11:40:26 +11:00
pci_32.c powerpc/pci: Support per-aperture memory offset 2013-05-06 13:40:40 +10:00
pci_64.c powerpc/pci: Don't use bitfield for force_32bit_msi 2013-08-14 11:50:25 +10:00
pci_dn.c powerpc: Make PCI device node device tree accesses endian safe 2013-08-14 15:33:31 +10:00
pci_of_scan.c powerpc: Fix little endian issue in OF PCI scan 2013-10-30 16:01:04 +11:00
pci-common.c of/irq: simplify args to irq_create_of_mapping 2013-10-24 11:42:57 +01:00
pci-hotplug.c powerpc/pci: Partial tree hotplug support 2013-07-24 14:18:48 +10:00
pmc.c bug.h: add include of it to various implicit C users 2012-02-29 17:15:08 -05:00
ppc32.h powerpc: switch to generic old sigaction() 2013-02-03 18:16:10 -05:00
ppc_ksyms.c Merge branch 'for-kvm' into next 2013-10-11 18:23:53 +11:00
ppc_save_regs.S Fix common misspellings 2011-03-31 11:26:23 -03:00
proc_powerpc.c proc_powerpc: switch to fixed_size_llseek() 2013-06-29 12:57:50 +04:00
process.c powerpc: fix exception clearing in e500 SPE float emulation 2014-01-07 18:32:21 -06:00
prom_init_check.sh powerpc/pmac: Early debug output on screen on 64-bit macs 2013-08-14 14:57:40 +10:00
prom_init.c powerpc: prom_init exception when updating core value 2013-10-11 16:53:16 +11:00
prom_parse.c powerpc: of_parse_dma_window should take a __be32 *dma_window 2013-08-14 15:33:26 +10:00
prom.c powerpc: Make cpu_to_chip_id() available when SMP=n 2013-11-21 10:33:44 +11:00
ptrace32.c powerpc: move debug registers in a structure 2013-10-18 18:44:49 -05:00
ptrace.c powerpc: PTRACE_PEEKUSR always returns FPR0 2013-12-13 15:48:33 +11:00
reloc_32.S powerpc: Don't flush/invalidate the d/icache for an unknown relocation type 2013-07-01 11:10:34 +10:00
reloc_64.S
rtas_flash.c powerpc/rtas_flash: Fix validate_flash buffer overflow issue 2013-05-14 14:36:26 +10:00
rtas_pci.c powerpc/kernel: Fix endian issue in rtas_pci 2013-10-11 16:50:22 +11:00
rtas-proc.c
rtas-rtc.c powerpc/rtas-rtc: remove sideeffects of printk_ratelimit 2011-06-29 15:30:43 +10:00
rtas.c powerpc: Make RTAS calls endian safe 2013-08-14 15:33:22 +10:00
rtasd.c powerpc/pseries: Add /proc interface to control topology updates 2013-04-26 16:08:26 +10:00
setup_32.c powerpc: Move local setup.h declarations to arch includes 2013-10-30 16:00:31 +11:00
setup_64.c powerpc/book3s: Introduce exclusive emergency stack for machine check exception. 2013-12-05 16:02:05 +11:00
setup-common.c powerpc: Fix endian issue in setup-common.c 2013-12-13 15:48:34 +11:00
signal_32.c powerpc/signals: Improved mark VSX not saved with small contexts fix 2013-11-25 11:50:51 +11:00
signal_64.c powerpc/signals: Improved mark VSX not saved with small contexts fix 2013-11-25 11:50:51 +11:00
signal.c powerpc/tm: Fix userspace stack corruption on signal delivery for active transactions 2013-06-01 08:29:23 +10:00
signal.h powerpc/tm: Fix userspace stack corruption on signal delivery for active transactions 2013-06-01 08:29:23 +10:00
smp-tbsync.c POWERPC: drivers: remove __dev* attributes. 2013-01-03 15:57:04 -08:00
smp.c Merge branch 'merge' into next 2013-12-30 15:19:31 +11:00
stacktrace.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
suspend.c update email address 2010-07-19 10:56:54 +02:00
swsusp_32.S Fix common misspellings 2011-03-31 11:26:23 -03:00
swsusp_64.c Disintegrate asm/system.h for PowerPC 2012-03-28 18:30:02 +01:00
swsusp_asm64.S powerpc: Only save/restore SDR1 if in hypervisor mode 2013-10-31 12:37:29 +11:00
swsusp_booke.S powerpc/mpc85xx: invalidate TLB after hibernation resume 2013-07-30 15:50:08 -05:00
swsusp.c Disintegrate asm/system.h for PowerPC 2012-03-28 18:30:02 +01:00
sys_ppc32.c unify compat fanotify_mark(2), switch to COMPAT_SYSCALL_DEFINE 2013-05-09 13:46:38 -04:00
syscalls.c powerpc: Fix personality handling in ppc64_personality() 2012-08-24 20:26:07 +10:00
sysfs.c powerpc/kernel/sysfs: Cleanup set up macros for PMC/non-PMC SPRs 2013-12-02 14:16:04 +11:00
systbl_chk.c
systbl_chk.sh
systbl.S
tau_6xx.c
time.c powerpc: Make irq_stat.timers_irqs counting more specific 2013-12-02 14:14:50 +11:00
tm.S powerpc: Use 32 bit loads and stores when operating on condition register values 2013-10-30 16:02:14 +11:00
traps.c powerpc/book3s: Introduce a early machine check hook in cpu_spec. 2013-12-05 16:04:37 +11:00
udbg_16550.c powerpc/wsp: Fix early debug build 2013-08-16 10:59:27 +10:00
udbg.c powerpc: Add a configuration option for early BootX/OpenFirmware debug 2013-06-20 16:55:12 +10:00
uprobes.c uretprobes/powerpc: Hijack return address 2013-04-13 15:31:56 +02:00
vdso.c powerpc: Move local setup.h declarations to arch includes 2013-10-30 16:00:31 +11:00
vecemu.c powerpc: Put FP/VSX and VR state into structures 2013-10-11 17:26:49 +11:00
vector.S powerpc: Don't corrupt user registers on 32-bit 2013-10-23 22:34:19 +11:00
vio.c powerpc/iommu: Update the generic code to use dynamic iommu page sizes 2013-12-30 14:17:19 +11:00
vmlinux.lds.S powerpc/modules: Module CRC relocation fix causes perf issues 2013-07-24 14:18:43 +10:00