shadow.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. Shadowbyte macros
  3. */
  4. /* $Id$ */
  5. #include "logging.h"
  6. #ifdef LOGGING
  7. extern char *data_sh; /* shadowbytes of data space */
  8. extern char *stack_sh; /* shadowbytes of stack space */
  9. extern char *stackML_sh; /* stack_sh + ML (to speed up stack access) */
  10. /* Bit 0, 1, 2 and 3: datatype/pointertype. */
  11. #define SH_INT (0x01)
  12. #define SH_FLOAT (0x02)
  13. #define SH_DATAP (0x04)
  14. #define SH_INSP (0x08)
  15. /* Bit 7: protection bit */
  16. #define SH_PROT (0x80)
  17. /******** Shadowbytes, general ********/
  18. #define dt_sh(a) (*(data_sh + (p2i(a))))
  19. #define st_sh(a) (*(stackML_sh - (a)))
  20. #define mem_sh(a) (in_stack(a) ? st_sh(a) : dt_sh(a))
  21. /******** Shadowbytes settings for data ********/
  22. #define dt_undef(a) (dt_sh(a) = UNDEFINED)
  23. #define dt_int(a) (dt_sh(a) = SH_INT)
  24. #define dt_fl(a) (dt_sh(a) = SH_FLOAT)
  25. #define dt_ip(a) (dt_sh(a) = SH_INSP)
  26. #define dt_dp(a) (dt_sh(a) = SH_DATAP)
  27. #define dt_prot2b(a) { dt_sh(a) |= SH_PROT; dt_sh(a+1) |= SH_PROT; }
  28. #define dt_unpr2b(a) { dt_sh(a) &= ~SH_PROT; dt_sh(a+1) &= ~SH_PROT; }
  29. #define dt_prot(a,n) { dt_prot2b(a); \
  30. if ((n) == 4) { dt_prot2b(a+2); } }
  31. #define dt_unprot(a,n) { dt_unpr2b(a); \
  32. if ((n) == 4) { dt_unpr2b(a+2); } }
  33. /******** Shadowbytes settings for stack ********/
  34. #define st_undef(a) (st_sh(a) = UNDEFINED)
  35. #define st_int(a) (st_sh(a) = SH_INT)
  36. #define st_fl(a) (st_sh(a) = SH_FLOAT)
  37. #define st_ip(a) (st_sh(a) = SH_INSP)
  38. #define st_dp(a) (st_sh(a) = SH_DATAP)
  39. #define st_prot2b(a) { st_sh(a) |= SH_PROT; st_sh(a+1) |= SH_PROT; }
  40. #define st_unpr2b(a) { st_sh(a) &= ~SH_PROT; st_sh(a+1) &= ~SH_PROT; }
  41. #define st_prot(a,n) { st_prot2b(a); \
  42. if ((n) == 4) { st_prot2b(a+2); } }
  43. #define st_unprot(a,n) { st_unpr2b(a); \
  44. if ((n) == 4) { st_unpr2b(a+2); } }
  45. /******** Shadowbytes checking for data ********/
  46. #define is_dt_set(a,n,s) ((dt_sh(a) & s) && (dt_sh(a+(n-1)) & s))
  47. #define is_dt_prot(a) (dt_sh(a) & SH_PROT)
  48. #define ch_dt_prot(a) { if (is_dt_prot(a)) warning(WDESROM); }
  49. /******** Shadowbytes checking for stack ********/
  50. #define is_st_set(a,n,s) ((st_sh(a) & s) && (st_sh(a+(n-1)) & s))
  51. #define is_st_prot(a) (st_sh(a) & SH_PROT)
  52. #define ch_st_prot(a) { if (is_st_prot(a)) warning(WDESRSB); }
  53. #else
  54. #define dt_undef(a)
  55. #define dt_int(a)
  56. #define dt_fl(a)
  57. #define dt_ip(a)
  58. #define dt_dp(a)
  59. #define dt_prot(a,n)
  60. #define dt_unprot(a,b)
  61. #define st_undef(a)
  62. #define st_int(a)
  63. #define st_fl(a)
  64. #define st_ip(a)
  65. #define st_dp(a)
  66. #define st_prot(a,n)
  67. #define st_unprot(a,b)
  68. #define ch_dt_prot(a)
  69. #define ch_st_prot(a)
  70. #endif /* LOGGING */