module.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.     Fast Floating Point Emulator
  3.     (c) Peter Teichmann <mail@peter-teichmann.de>
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. #include <linux/module.h>
  17. #include <linux/types.h>
  18. #include <linux/kernel.h>
  19. #include <linux/signal.h>
  20. #include <linux/sched.h>
  21. #include <linux/init.h>
  22. #ifndef MODULE
  23. #define kern_fp_enter fp_enter
  24. extern char fpe_type[];
  25. #endif
  26. static void (*orig_fp_enter)(void); /* old kern_fp_enter value */
  27. extern void (*kern_fp_enter)(void); /* current FP handler */
  28. extern void fastfpe_enter(void); /* forward declarations */
  29. #ifdef MODULE
  30. /*
  31.  * Return 0 if we can be unloaded.  This can only happen if
  32.  * kern_fp_enter is still pointing at fastfpe_enter
  33.  */
  34. static int fpe_unload(void)
  35. {
  36.   return (kern_fp_enter == fastfpe_enter) ? 0 : 1;
  37. }
  38. #endif
  39. static int __init fpe_init(void)
  40. {
  41. #ifdef MODULE
  42.   if (!mod_member_present(&__this_module, can_unload))
  43.     return -EINVAL;
  44.   __this_module.can_unload = fpe_unload;
  45. #else
  46.   if (fpe_type[0] && strcmp(fpe_type, "fastfpe"))
  47.     return 0;
  48. #endif
  49.   printk("Fast Floating Point Emulator V0.9 (c) Peter Teichmann.n");
  50.   /* Save pointer to the old FP handler and then patch ourselves in */
  51.   orig_fp_enter = kern_fp_enter;
  52.   kern_fp_enter = fastfpe_enter;
  53.   return 0;
  54. }
  55. static void __exit fpe_exit(void)
  56. {
  57.   /* Restore the values we saved earlier. */
  58.   kern_fp_enter = orig_fp_enter;
  59. }
  60. module_init(fpe_init);
  61. module_exit(fpe_exit);
  62. MODULE_AUTHOR("Peter Teichmann <mail@peter-teichmann.de>");
  63. MODULE_DESCRIPTION("Fast floating point emulator with full precision");