Guest User

Untitled

a guest
May 20th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. #define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
  2. void do_##name(struct pt_regs *regs, long error_code) \
  3. { \
  4. siginfo_t info; \
  5. info.si_signo = signr; \
  6. info.si_errno = 0; \
  7. info.si_code = sicode; \
  8. info.si_addr = (void __user *)siaddr; \
  9. trace_hardirqs_fixup(); \
  10. if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
  11. == NOTIFY_STOP) \
  12. return; \
  13. do_trap(trapnr, signr, str, 1, regs, error_code, &info); \
  14. }
  15.  
  16. DO_VM86_ERROR_INFO(0, SIGFPE, "divide error", divide_error, FPE_INTDIV, regs->ip)
  17.  
  18. static void __kprobes
  19. do_trap(int trapnr, int signr, char *str, int vm86, struct pt_regs *regs,
  20. long error_code, siginfo_t *info)
  21. {
  22. struct task_struct *tsk = current;
  23.  
  24. if (regs->flags & X86_VM_MASK) {
  25. if (vm86)
  26. goto vm86_trap;
  27. goto trap_signal;
  28. }
  29.  
  30. if (!user_mode(regs))
  31. goto kernel_trap;
  32.  
  33. trap_signal:
  34. /*
  35. * We want error_code and trap_no set for userspace faults and
  36. * kernelspace faults which result in die(), but not
  37. * kernelspace faults which are fixed up. die() gives the
  38. * process no chance to handle the signal and notice the
  39. * kernel fault information, so that won't result in polluting
  40. * the information about previously queued, but not yet
  41. * delivered, faults. See also do_general_protection below.
  42. */
  43. tsk->thread.error_code = error_code;
  44. tsk->thread.trap_no = trapnr;
  45.  
  46. if (info)
  47. force_sig_info(signr, info, tsk);
  48. else
  49. force_sig(signr, tsk);
  50. return;
  51.  
  52. kernel_trap:
  53. if (!fixup_exception(regs)) {
  54. tsk->thread.error_code = error_code;
  55. tsk->thread.trap_no = trapnr;
  56. die(str, regs, error_code);
  57. }
  58. return;
  59.  
  60. vm86_trap:
  61. if (handle_vm86_trap((struct kernel_vm86_regs *) regs,
  62. error_code, trapnr))
  63. goto trap_signal;
  64. return;
  65. }
Add Comment
Please, Sign In to add comment