x86check.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:3k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. /* x86 calling conventions checking. */
  2. /*
  3. Copyright 2000, 2001 Free Software Foundation, Inc.
  4. This file is part of the GNU MP Library.
  5. The GNU MP Library is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU Lesser General Public License as published by
  7. the Free Software Foundation; either version 3 of the License, or (at your
  8. option) any later version.
  9. The GNU MP Library is distributed in the hope that it will be useful, but
  10. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  12. License for more details.
  13. You should have received a copy of the GNU Lesser General Public License
  14. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  15. #include <stdio.h>
  16. #include "gmp.h"
  17. #include "gmp-impl.h"
  18. #include "tests.h"
  19. /* temporaries */
  20. int  calling_conventions_save_ebx;
  21. int  calling_conventions_save_esi;
  22. int  calling_conventions_save_edi;
  23. int  calling_conventions_save_ebp;
  24. int  calling_conventions_retaddr;
  25. int  calling_conventions_retval;
  26. /* values to check */
  27. struct {
  28.   unsigned  control;
  29.   unsigned  status;
  30.   unsigned  tag;
  31.   unsigned  other[4];
  32. } calling_conventions_fenv;
  33. int  calling_conventions_ebx;
  34. int  calling_conventions_esi;
  35. int  calling_conventions_edi;
  36. int  calling_conventions_ebp;
  37. int  calling_conventions_eflags;
  38. /* expected values, as per x86call.asm */
  39. #define VALUE_EBX   0x01234567
  40. #define VALUE_ESI   0x89ABCDEF
  41. #define VALUE_EDI   0xFEDCBA98
  42. #define VALUE_EBP   0x76543210
  43. #define DIR_BIT(eflags)   (((eflags) & (1<<10)) != 0)
  44. /* Return 1 if ok, 0 if not */
  45. int
  46. calling_conventions_check (void)
  47. {
  48.   const char  *header = "Violated calling conventions:n";
  49.   int  ret = 1;
  50. #define CHECK(callreg, regstr, value)                   
  51.   if (callreg != value)                                 
  52.     {                                                   
  53.       printf ("%s   %s  got 0x%08X want 0x%08Xn",      
  54.               header, regstr, callreg, value);          
  55.       header = "";                                      
  56.       ret = 0;                                          
  57.     }
  58.   CHECK (calling_conventions_ebx, "ebx", VALUE_EBX);
  59.   CHECK (calling_conventions_esi, "esi", VALUE_ESI);
  60.   CHECK (calling_conventions_edi, "edi", VALUE_EDI);
  61.   CHECK (calling_conventions_ebp, "ebp", VALUE_EBP);
  62.   if (DIR_BIT (calling_conventions_eflags) != 0)
  63.     {
  64.       printf ("%s   eflags dir bit  got %d want 0n",
  65.               header, DIR_BIT (calling_conventions_eflags));
  66.       header = "";
  67.       ret = 0;
  68.     }
  69.   if ((calling_conventions_fenv.tag & 0xFFFF) != 0xFFFF)
  70.     {
  71.       printf ("%s   fpu tags  got 0x%X want 0xFFFFn",
  72.               header, calling_conventions_fenv.tag & 0xFFFF);
  73.       header = "";
  74.       ret = 0;
  75.     }
  76.   return ret;
  77. }