1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 1994 Linus Torvalds 4 * 5 * Pentium III FXSR, SSE support 6 * General FPU state handling cleanups 7 * Gareth Hughes <gareth@valinux.com>, May 2000 8 */ 9 #include <asm/fpu/api.h> 10 #include <asm/fpu/regset.h> 11 #include <asm/fpu/sched.h> 12 #include <asm/fpu/signal.h> 13 #include <asm/fpu/types.h> 14 #include <asm/traps.h> 15 #include <asm/irq_regs.h> 16 17 #include <linux/hardirq.h> 18 #include <linux/pkeys.h> 19 #include <linux/vmalloc.h> 20 21 #include "context.h" 22 #include "internal.h" 23 #include "legacy.h" 24 #include "xstate.h" 25 26 #define CREATE_TRACE_POINTS 27 #include <asm/trace/fpu.h> 28 29 #ifdef CONFIG_X86_64 30 DEFINE_STATIC_KEY_FALSE(__fpu_state_size_dynamic); 31 DEFINE_PER_CPU(u64, xfd_state); 32 #endif 33 34 /* The FPU state configuration data for kernel and user space */ 35 struct fpu_state_config fpu_kernel_cfg __ro_after_init; 36 struct fpu_state_config fpu_user_cfg __ro_after_init; 37 38 /* 39 * Represents the initial FPU state. It's mostly (but not completely) zeroes, 40 * depending on the FPU hardware format: 41 */ 42 struct fpstate init_fpstate __ro_after_init; 43 44 /* 45 * Track whether the kernel is using the FPU state 46 * currently. 47 * 48 * This flag is used: 49 * 50 * - by IRQ context code to potentially use the FPU 51 * if it's unused. 52 * 53 * - to debug kernel_fpu_begin()/end() correctness 54 */ 55 static DEFINE_PER_CPU(bool, in_kernel_fpu); 56 57 /* 58 * Track which context is using the FPU on the CPU: 59 */ 60 DEFINE_PER_CPU(struct fpu *, fpu_fpregs_owner_ctx); 61 62 static bool kernel_fpu_disabled(void) 63 { 64 return this_cpu_read(in_kernel_fpu); 65 } 66 67 static bool interrupted_kernel_fpu_idle(void) 68 { 69 return !kernel_fpu_disabled(); 70 } 71 72 /* 73 * Were we in user mode (or vm86 mode) when we were 74 * interrupted? 75 * 76 * Doing kernel_fpu_begin/end() is ok if we are running 77 * in an interrupt context from user mode - we'll just 78 * save the FPU state as required. 79 */ 80 static bool interrupted_user_mode(void) 81 { 82 struct pt_regs *regs = get_irq_regs(); 83 return regs && user_mode(regs); 84 } 85 86 /* 87 * Can we use the FPU in kernel mode with the 88 * whole "kernel_fpu_begin/end()" sequence? 89 * 90 * It's always ok in process context (ie "not interrupt") 91 * but it is sometimes ok even from an irq. 92 */ 93 bool irq_fpu_usable(void) 94 { 95 return !in_interrupt() || 96 interrupted_user_mode() || 97 interrupted_kernel_fpu_idle(); 98 } 99 EXPORT_SYMBOL(irq_fpu_usable); 100 101 /* 102 * Save the FPU register state in fpu->fpstate->regs. The register state is 103 * preserved. 104 * 105 * Must be called with fpregs_lock() held. 106 * 107 * The legacy FNSAVE instruction clears all FPU state unconditionally, so 108 * register state has to be reloaded. That might be a pointless exercise 109 * when the FPU is going to be used by another task right after that. But 110 * this only affects 20+ years old 32bit systems and avoids conditionals all 111 * over the place. 112 * 113 * FXSAVE and all XSAVE variants preserve the FPU register state. 114 */ 115 void save_fpregs_to_fpstate(struct fpu *fpu) 116 { 117 if (likely(use_xsave())) { 118 os_xsave(fpu->fpstate); 119 120 /* 121 * AVX512 state is tracked here because its use is 122 * known to slow the max clock speed of the core. 123 */ 124 if (fpu->fpstate->regs.xsave.header.xfeatures & XFEATURE_MASK_AVX512) 125 fpu->avx512_timestamp = jiffies; 126 return; 127 } 128 129 if (likely(use_fxsr())) { 130 fxsave(&fpu->fpstate->regs.fxsave); 131 return; 132 } 133 134 /* 135 * Legacy FPU register saving, FNSAVE always clears FPU registers, 136 * so we have to reload them from the memory state. 137 */ 138 asm volatile("fnsave %[fp]; fwait" : [fp] "=m" (fpu->fpstate->regs.fsave)); 139 frstor(&fpu->fpstate->regs.fsave); 140 } 141 142 void restore_fpregs_from_fpstate(struct fpstate *fpstate, u64 mask) 143 { 144 /* 145 * AMD K7/K8 and later CPUs up to Zen don't save/restore 146 * FDP/FIP/FOP unless an exception is pending. Clear the x87 state 147 * here by setting it to fixed values. "m" is a random variable 148 * that should be in L1. 149 */ 150 if (unlikely(static_cpu_has_bug(X86_BUG_FXSAVE_LEAK))) { 151 asm volatile( 152 "fnclex\n\t" 153 "emms\n\t" 154 "fildl %P[addr]" /* set F?P to defined value */ 155 : : [addr] "m" (fpstate)); 156 } 157 158 if (use_xsave()) { 159 /* 160 * Dynamically enabled features are enabled in XCR0, but 161 * usage requires also that the corresponding bits in XFD 162 * are cleared. If the bits are set then using a related 163 * instruction will raise #NM. This allows to do the 164 * allocation of the larger FPU buffer lazy from #NM or if 165 * the task has no permission to kill it which would happen 166 * via #UD if the feature is disabled in XCR0. 167 * 168 * XFD state is following the same life time rules as 169 * XSTATE and to restore state correctly XFD has to be 170 * updated before XRSTORS otherwise the component would 171 * stay in or go into init state even if the bits are set 172 * in fpstate::regs::xsave::xfeatures. 173 */ 174 xfd_update_state(fpstate); 175 176 /* 177 * Restoring state always needs to modify all features 178 * which are in @mask even if the current task cannot use 179 * extended features. 180 * 181 * So fpstate->xfeatures cannot be used here, because then 182 * a feature for which the task has no permission but was 183 * used by the previous task would not go into init state. 184 */ 185 mask = fpu_kernel_cfg.max_features & mask; 186 187 os_xrstor(fpstate, mask); 188 } else { 189 if (use_fxsr()) 190 fxrstor(&fpstate->regs.fxsave); 191 else 192 frstor(&fpstate->regs.fsave); 193 } 194 } 195 196 void fpu_reset_from_exception_fixup(void) 197 { 198 restore_fpregs_from_fpstate(&init_fpstate, XFEATURE_MASK_FPSTATE); 199 } 200 201 #if IS_ENABLED(CONFIG_KVM) 202 static void __fpstate_reset(struct fpstate *fpstate); 203 204 bool fpu_alloc_guest_fpstate(struct fpu_guest *gfpu) 205 { 206 struct fpstate *fpstate; 207 unsigned int size; 208 209 size = fpu_user_cfg.default_size + ALIGN(offsetof(struct fpstate, regs), 64); 210 fpstate = vzalloc(size); 211 if (!fpstate) 212 return false; 213 214 __fpstate_reset(fpstate); 215 fpstate_init_user(fpstate); 216 fpstate->is_valloc = true; 217 fpstate->is_guest = true; 218 219 gfpu->fpstate = fpstate; 220 return true; 221 } 222 EXPORT_SYMBOL_GPL(fpu_alloc_guest_fpstate); 223 224 void fpu_free_guest_fpstate(struct fpu_guest *gfpu) 225 { 226 struct fpstate *fps = gfpu->fpstate; 227 228 if (!fps) 229 return; 230 231 if (WARN_ON_ONCE(!fps->is_valloc || !fps->is_guest || fps->in_use)) 232 return; 233 234 gfpu->fpstate = NULL; 235 vfree(fps); 236 } 237 EXPORT_SYMBOL_GPL(fpu_free_guest_fpstate); 238 239 int fpu_swap_kvm_fpstate(struct fpu_guest *guest_fpu, bool enter_guest) 240 { 241 struct fpstate *guest_fps = guest_fpu->fpstate; 242 struct fpu *fpu = ¤t->thread.fpu; 243 struct fpstate *cur_fps = fpu->fpstate; 244 245 fpregs_lock(); 246 if (!cur_fps->is_confidential && !test_thread_flag(TIF_NEED_FPU_LOAD)) 247 save_fpregs_to_fpstate(fpu); 248 249 /* Swap fpstate */ 250 if (enter_guest) { 251 fpu->__task_fpstate = cur_fps; 252 fpu->fpstate = guest_fps; 253 guest_fps->in_use = true; 254 } else { 255 guest_fps->in_use = false; 256 fpu->fpstate = fpu->__task_fpstate; 257 fpu->__task_fpstate = NULL; 258 } 259 260 cur_fps = fpu->fpstate; 261 262 if (!cur_fps->is_confidential) { 263 /* Includes XFD update */ 264 restore_fpregs_from_fpstate(cur_fps, XFEATURE_MASK_FPSTATE); 265 } else { 266 /* 267 * XSTATE is restored by firmware from encrypted 268 * memory. Make sure XFD state is correct while 269 * running with guest fpstate 270 */ 271 xfd_update_state(cur_fps); 272 } 273 274 fpregs_mark_activate(); 275 fpregs_unlock(); 276 return 0; 277 } 278 EXPORT_SYMBOL_GPL(fpu_swap_kvm_fpstate); 279 280 void fpu_copy_guest_fpstate_to_uabi(struct fpu_guest *gfpu, void *buf, 281 unsigned int size, u32 pkru) 282 { 283 struct fpstate *kstate = gfpu->fpstate; 284 union fpregs_state *ustate = buf; 285 struct membuf mb = { .p = buf, .left = size }; 286 287 if (cpu_feature_enabled(X86_FEATURE_XSAVE)) { 288 __copy_xstate_to_uabi_buf(mb, kstate, pkru, XSTATE_COPY_XSAVE); 289 } else { 290 memcpy(&ustate->fxsave, &kstate->regs.fxsave, 291 sizeof(ustate->fxsave)); 292 /* Make it restorable on a XSAVE enabled host */ 293 ustate->xsave.header.xfeatures = XFEATURE_MASK_FPSSE; 294 } 295 } 296 EXPORT_SYMBOL_GPL(fpu_copy_guest_fpstate_to_uabi); 297 298 int fpu_copy_uabi_to_guest_fpstate(struct fpu_guest *gfpu, const void *buf, 299 u64 xcr0, u32 *vpkru) 300 { 301 struct fpstate *kstate = gfpu->fpstate; 302 const union fpregs_state *ustate = buf; 303 struct pkru_state *xpkru; 304 int ret; 305 306 if (!cpu_feature_enabled(X86_FEATURE_XSAVE)) { 307 if (ustate->xsave.header.xfeatures & ~XFEATURE_MASK_FPSSE) 308 return -EINVAL; 309 if (ustate->fxsave.mxcsr & ~mxcsr_feature_mask) 310 return -EINVAL; 311 memcpy(&kstate->regs.fxsave, &ustate->fxsave, sizeof(ustate->fxsave)); 312 return 0; 313 } 314 315 if (ustate->xsave.header.xfeatures & ~xcr0) 316 return -EINVAL; 317 318 ret = copy_uabi_from_kernel_to_xstate(kstate, ustate); 319 if (ret) 320 return ret; 321 322 /* Retrieve PKRU if not in init state */ 323 if (kstate->regs.xsave.header.xfeatures & XFEATURE_MASK_PKRU) { 324 xpkru = get_xsave_addr(&kstate->regs.xsave, XFEATURE_PKRU); 325 *vpkru = xpkru->pkru; 326 } 327 328 /* Ensure that XCOMP_BV is set up for XSAVES */ 329 xstate_init_xcomp_bv(&kstate->regs.xsave, kstate->xfeatures); 330 return 0; 331 } 332 EXPORT_SYMBOL_GPL(fpu_copy_uabi_to_guest_fpstate); 333 #endif /* CONFIG_KVM */ 334 335 void kernel_fpu_begin_mask(unsigned int kfpu_mask) 336 { 337 preempt_disable(); 338 339 WARN_ON_FPU(!irq_fpu_usable()); 340 WARN_ON_FPU(this_cpu_read(in_kernel_fpu)); 341 342 this_cpu_write(in_kernel_fpu, true); 343 344 if (!(current->flags & PF_KTHREAD) && 345 !test_thread_flag(TIF_NEED_FPU_LOAD)) { 346 set_thread_flag(TIF_NEED_FPU_LOAD); 347 save_fpregs_to_fpstate(¤t->thread.fpu); 348 } 349 __cpu_invalidate_fpregs_state(); 350 351 /* Put sane initial values into the control registers. */ 352 if (likely(kfpu_mask & KFPU_MXCSR) && boot_cpu_has(X86_FEATURE_XMM)) 353 ldmxcsr(MXCSR_DEFAULT); 354 355 if (unlikely(kfpu_mask & KFPU_387) && boot_cpu_has(X86_FEATURE_FPU)) 356 asm volatile ("fninit"); 357 } 358 EXPORT_SYMBOL_GPL(kernel_fpu_begin_mask); 359 360 void kernel_fpu_end(void) 361 { 362 WARN_ON_FPU(!this_cpu_read(in_kernel_fpu)); 363 364 this_cpu_write(in_kernel_fpu, false); 365 preempt_enable(); 366 } 367 EXPORT_SYMBOL_GPL(kernel_fpu_end); 368 369 /* 370 * Sync the FPU register state to current's memory register state when the 371 * current task owns the FPU. The hardware register state is preserved. 372 */ 373 void fpu_sync_fpstate(struct fpu *fpu) 374 { 375 WARN_ON_FPU(fpu != ¤t->thread.fpu); 376 377 fpregs_lock(); 378 trace_x86_fpu_before_save(fpu); 379 380 if (!test_thread_flag(TIF_NEED_FPU_LOAD)) 381 save_fpregs_to_fpstate(fpu); 382 383 trace_x86_fpu_after_save(fpu); 384 fpregs_unlock(); 385 } 386 387 static inline unsigned int init_fpstate_copy_size(void) 388 { 389 if (!use_xsave()) 390 return fpu_kernel_cfg.default_size; 391 392 /* XSAVE(S) just needs the legacy and the xstate header part */ 393 return sizeof(init_fpstate.regs.xsave); 394 } 395 396 static inline void fpstate_init_fxstate(struct fpstate *fpstate) 397 { 398 fpstate->regs.fxsave.cwd = 0x37f; 399 fpstate->regs.fxsave.mxcsr = MXCSR_DEFAULT; 400 } 401 402 /* 403 * Legacy x87 fpstate state init: 404 */ 405 static inline void fpstate_init_fstate(struct fpstate *fpstate) 406 { 407 fpstate->regs.fsave.cwd = 0xffff037fu; 408 fpstate->regs.fsave.swd = 0xffff0000u; 409 fpstate->regs.fsave.twd = 0xffffffffu; 410 fpstate->regs.fsave.fos = 0xffff0000u; 411 } 412 413 /* 414 * Used in two places: 415 * 1) Early boot to setup init_fpstate for non XSAVE systems 416 * 2) fpu_init_fpstate_user() which is invoked from KVM 417 */ 418 void fpstate_init_user(struct fpstate *fpstate) 419 { 420 if (!cpu_feature_enabled(X86_FEATURE_FPU)) { 421 fpstate_init_soft(&fpstate->regs.soft); 422 return; 423 } 424 425 xstate_init_xcomp_bv(&fpstate->regs.xsave, fpstate->xfeatures); 426 427 if (cpu_feature_enabled(X86_FEATURE_FXSR)) 428 fpstate_init_fxstate(fpstate); 429 else 430 fpstate_init_fstate(fpstate); 431 } 432 433 static void __fpstate_reset(struct fpstate *fpstate) 434 { 435 /* Initialize sizes and feature masks */ 436 fpstate->size = fpu_kernel_cfg.default_size; 437 fpstate->user_size = fpu_user_cfg.default_size; 438 fpstate->xfeatures = fpu_kernel_cfg.default_features; 439 fpstate->user_xfeatures = fpu_user_cfg.default_features; 440 fpstate->xfd = init_fpstate.xfd; 441 } 442 443 void fpstate_reset(struct fpu *fpu) 444 { 445 /* Set the fpstate pointer to the default fpstate */ 446 fpu->fpstate = &fpu->__fpstate; 447 __fpstate_reset(fpu->fpstate); 448 449 /* Initialize the permission related info in fpu */ 450 fpu->perm.__state_perm = fpu_kernel_cfg.default_features; 451 fpu->perm.__state_size = fpu_kernel_cfg.default_size; 452 fpu->perm.__user_state_size = fpu_user_cfg.default_size; 453 } 454 455 static inline void fpu_inherit_perms(struct fpu *dst_fpu) 456 { 457 if (fpu_state_size_dynamic()) { 458 struct fpu *src_fpu = ¤t->group_leader->thread.fpu; 459 460 spin_lock_irq(¤t->sighand->siglock); 461 /* Fork also inherits the permissions of the parent */ 462 dst_fpu->perm = src_fpu->perm; 463 spin_unlock_irq(¤t->sighand->siglock); 464 } 465 } 466 467 /* Clone current's FPU state on fork */ 468 int fpu_clone(struct task_struct *dst, unsigned long clone_flags) 469 { 470 struct fpu *src_fpu = ¤t->thread.fpu; 471 struct fpu *dst_fpu = &dst->thread.fpu; 472 473 /* The new task's FPU state cannot be valid in the hardware. */ 474 dst_fpu->last_cpu = -1; 475 476 fpstate_reset(dst_fpu); 477 478 if (!cpu_feature_enabled(X86_FEATURE_FPU)) 479 return 0; 480 481 /* 482 * Enforce reload for user space tasks and prevent kernel threads 483 * from trying to save the FPU registers on context switch. 484 */ 485 set_tsk_thread_flag(dst, TIF_NEED_FPU_LOAD); 486 487 /* 488 * No FPU state inheritance for kernel threads and IO 489 * worker threads. 490 */ 491 if (dst->flags & (PF_KTHREAD | PF_IO_WORKER)) { 492 /* Clear out the minimal state */ 493 memcpy(&dst_fpu->fpstate->regs, &init_fpstate.regs, 494 init_fpstate_copy_size()); 495 return 0; 496 } 497 498 /* 499 * If a new feature is added, ensure all dynamic features are 500 * caller-saved from here! 501 */ 502 BUILD_BUG_ON(XFEATURE_MASK_USER_DYNAMIC != XFEATURE_MASK_XTILE_DATA); 503 504 /* 505 * Save the default portion of the current FPU state into the 506 * clone. Assume all dynamic features to be defined as caller- 507 * saved, which enables skipping both the expansion of fpstate 508 * and the copying of any dynamic state. 509 * 510 * Do not use memcpy() when TIF_NEED_FPU_LOAD is set because 511 * copying is not valid when current uses non-default states. 512 */ 513 fpregs_lock(); 514 if (test_thread_flag(TIF_NEED_FPU_LOAD)) 515 fpregs_restore_userregs(); 516 save_fpregs_to_fpstate(dst_fpu); 517 if (!(clone_flags & CLONE_THREAD)) 518 fpu_inherit_perms(dst_fpu); 519 fpregs_unlock(); 520 521 trace_x86_fpu_copy_src(src_fpu); 522 trace_x86_fpu_copy_dst(dst_fpu); 523 524 return 0; 525 } 526 527 /* 528 * Whitelist the FPU register state embedded into task_struct for hardened 529 * usercopy. 530 */ 531 void fpu_thread_struct_whitelist(unsigned long *offset, unsigned long *size) 532 { 533 *offset = offsetof(struct thread_struct, fpu.__fpstate.regs); 534 *size = fpu_kernel_cfg.default_size; 535 } 536 537 /* 538 * Drops current FPU state: deactivates the fpregs and 539 * the fpstate. NOTE: it still leaves previous contents 540 * in the fpregs in the eager-FPU case. 541 * 542 * This function can be used in cases where we know that 543 * a state-restore is coming: either an explicit one, 544 * or a reschedule. 545 */ 546 void fpu__drop(struct fpu *fpu) 547 { 548 preempt_disable(); 549 550 if (fpu == ¤t->thread.fpu) { 551 /* Ignore delayed exceptions from user space */ 552 asm volatile("1: fwait\n" 553 "2:\n" 554 _ASM_EXTABLE(1b, 2b)); 555 fpregs_deactivate(fpu); 556 } 557 558 trace_x86_fpu_dropped(fpu); 559 560 preempt_enable(); 561 } 562 563 /* 564 * Clear FPU registers by setting them up from the init fpstate. 565 * Caller must do fpregs_[un]lock() around it. 566 */ 567 static inline void restore_fpregs_from_init_fpstate(u64 features_mask) 568 { 569 if (use_xsave()) 570 os_xrstor(&init_fpstate, features_mask); 571 else if (use_fxsr()) 572 fxrstor(&init_fpstate.regs.fxsave); 573 else 574 frstor(&init_fpstate.regs.fsave); 575 576 pkru_write_default(); 577 } 578 579 /* 580 * Reset current->fpu memory state to the init values. 581 */ 582 static void fpu_reset_fpregs(void) 583 { 584 struct fpu *fpu = ¤t->thread.fpu; 585 586 fpregs_lock(); 587 fpu__drop(fpu); 588 /* 589 * This does not change the actual hardware registers. It just 590 * resets the memory image and sets TIF_NEED_FPU_LOAD so a 591 * subsequent return to usermode will reload the registers from the 592 * task's memory image. 593 * 594 * Do not use fpstate_init() here. Just copy init_fpstate which has 595 * the correct content already except for PKRU. 596 * 597 * PKRU handling does not rely on the xstate when restoring for 598 * user space as PKRU is eagerly written in switch_to() and 599 * flush_thread(). 600 */ 601 memcpy(&fpu->fpstate->regs, &init_fpstate.regs, init_fpstate_copy_size()); 602 set_thread_flag(TIF_NEED_FPU_LOAD); 603 fpregs_unlock(); 604 } 605 606 /* 607 * Reset current's user FPU states to the init states. current's 608 * supervisor states, if any, are not modified by this function. The 609 * caller guarantees that the XSTATE header in memory is intact. 610 */ 611 void fpu__clear_user_states(struct fpu *fpu) 612 { 613 WARN_ON_FPU(fpu != ¤t->thread.fpu); 614 615 fpregs_lock(); 616 if (!cpu_feature_enabled(X86_FEATURE_FPU)) { 617 fpu_reset_fpregs(); 618 fpregs_unlock(); 619 return; 620 } 621 622 /* 623 * Ensure that current's supervisor states are loaded into their 624 * corresponding registers. 625 */ 626 if (xfeatures_mask_supervisor() && 627 !fpregs_state_valid(fpu, smp_processor_id())) 628 os_xrstor_supervisor(fpu->fpstate); 629 630 /* Reset user states in registers. */ 631 restore_fpregs_from_init_fpstate(XFEATURE_MASK_USER_RESTORE); 632 633 /* 634 * Now all FPU registers have their desired values. Inform the FPU 635 * state machine that current's FPU registers are in the hardware 636 * registers. The memory image does not need to be updated because 637 * any operation relying on it has to save the registers first when 638 * current's FPU is marked active. 639 */ 640 fpregs_mark_activate(); 641 fpregs_unlock(); 642 } 643 644 void fpu_flush_thread(void) 645 { 646 fpstate_reset(¤t->thread.fpu); 647 fpu_reset_fpregs(); 648 } 649 /* 650 * Load FPU context before returning to userspace. 651 */ 652 void switch_fpu_return(void) 653 { 654 if (!static_cpu_has(X86_FEATURE_FPU)) 655 return; 656 657 fpregs_restore_userregs(); 658 } 659 EXPORT_SYMBOL_GPL(switch_fpu_return); 660 661 #ifdef CONFIG_X86_DEBUG_FPU 662 /* 663 * If current FPU state according to its tracking (loaded FPU context on this 664 * CPU) is not valid then we must have TIF_NEED_FPU_LOAD set so the context is 665 * loaded on return to userland. 666 */ 667 void fpregs_assert_state_consistent(void) 668 { 669 struct fpu *fpu = ¤t->thread.fpu; 670 671 if (test_thread_flag(TIF_NEED_FPU_LOAD)) 672 return; 673 674 WARN_ON_FPU(!fpregs_state_valid(fpu, smp_processor_id())); 675 } 676 EXPORT_SYMBOL_GPL(fpregs_assert_state_consistent); 677 #endif 678 679 void fpregs_mark_activate(void) 680 { 681 struct fpu *fpu = ¤t->thread.fpu; 682 683 fpregs_activate(fpu); 684 fpu->last_cpu = smp_processor_id(); 685 clear_thread_flag(TIF_NEED_FPU_LOAD); 686 } 687 688 /* 689 * x87 math exception handling: 690 */ 691 692 int fpu__exception_code(struct fpu *fpu, int trap_nr) 693 { 694 int err; 695 696 if (trap_nr == X86_TRAP_MF) { 697 unsigned short cwd, swd; 698 /* 699 * (~cwd & swd) will mask out exceptions that are not set to unmasked 700 * status. 0x3f is the exception bits in these regs, 0x200 is the 701 * C1 reg you need in case of a stack fault, 0x040 is the stack 702 * fault bit. We should only be taking one exception at a time, 703 * so if this combination doesn't produce any single exception, 704 * then we have a bad program that isn't synchronizing its FPU usage 705 * and it will suffer the consequences since we won't be able to 706 * fully reproduce the context of the exception. 707 */ 708 if (boot_cpu_has(X86_FEATURE_FXSR)) { 709 cwd = fpu->fpstate->regs.fxsave.cwd; 710 swd = fpu->fpstate->regs.fxsave.swd; 711 } else { 712 cwd = (unsigned short)fpu->fpstate->regs.fsave.cwd; 713 swd = (unsigned short)fpu->fpstate->regs.fsave.swd; 714 } 715 716 err = swd & ~cwd; 717 } else { 718 /* 719 * The SIMD FPU exceptions are handled a little differently, as there 720 * is only a single status/control register. Thus, to determine which 721 * unmasked exception was caught we must mask the exception mask bits 722 * at 0x1f80, and then use these to mask the exception bits at 0x3f. 723 */ 724 unsigned short mxcsr = MXCSR_DEFAULT; 725 726 if (boot_cpu_has(X86_FEATURE_XMM)) 727 mxcsr = fpu->fpstate->regs.fxsave.mxcsr; 728 729 err = ~(mxcsr >> 7) & mxcsr; 730 } 731 732 if (err & 0x001) { /* Invalid op */ 733 /* 734 * swd & 0x240 == 0x040: Stack Underflow 735 * swd & 0x240 == 0x240: Stack Overflow 736 * User must clear the SF bit (0x40) if set 737 */ 738 return FPE_FLTINV; 739 } else if (err & 0x004) { /* Divide by Zero */ 740 return FPE_FLTDIV; 741 } else if (err & 0x008) { /* Overflow */ 742 return FPE_FLTOVF; 743 } else if (err & 0x012) { /* Denormal, Underflow */ 744 return FPE_FLTUND; 745 } else if (err & 0x020) { /* Precision */ 746 return FPE_FLTRES; 747 } 748 749 /* 750 * If we're using IRQ 13, or supposedly even some trap 751 * X86_TRAP_MF implementations, it's possible 752 * we get a spurious trap, which is not an error. 753 */ 754 return 0; 755 } 756