mk_sc.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <linux/stddef.h>
  4. #define SC_OFFSET(name, field) \
  5. printf("#define " name "(sc) *((unsigned long *) &(((char *) (sc))[%d]))\n",\
  6. offsetof(struct sigcontext, field))
  7. #define SC_FP_OFFSET(name, field) \
  8. printf("#define " name \
  9. "(sc) *((unsigned long *) &(((char *) (SC_FPSTATE(sc)))[%d]))\n",\
  10. offsetof(struct _fpstate, field))
  11. #define SC_FP_OFFSET_PTR(name, field, type) \
  12. printf("#define " name \
  13. "(sc) ((" type " *) &(((char *) (SC_FPSTATE(sc)))[%d]))\n",\
  14. offsetof(struct _fpstate, field))
  15. int main(int argc, char **argv)
  16. {
  17. SC_OFFSET("SC_IP", eip);
  18. SC_OFFSET("SC_SP", esp);
  19. SC_OFFSET("SC_FS", fs);
  20. SC_OFFSET("SC_GS", gs);
  21. SC_OFFSET("SC_DS", ds);
  22. SC_OFFSET("SC_ES", es);
  23. SC_OFFSET("SC_SS", ss);
  24. SC_OFFSET("SC_CS", cs);
  25. SC_OFFSET("SC_EFLAGS", eflags);
  26. SC_OFFSET("SC_EAX", eax);
  27. SC_OFFSET("SC_EBX", ebx);
  28. SC_OFFSET("SC_ECX", ecx);
  29. SC_OFFSET("SC_EDX", edx);
  30. SC_OFFSET("SC_EDI", edi);
  31. SC_OFFSET("SC_ESI", esi);
  32. SC_OFFSET("SC_EBP", ebp);
  33. SC_OFFSET("SC_TRAPNO", trapno);
  34. SC_OFFSET("SC_ERR", err);
  35. SC_OFFSET("SC_CR2", cr2);
  36. SC_OFFSET("SC_FPSTATE", fpstate);
  37. SC_OFFSET("SC_SIGMASK", oldmask);
  38. SC_FP_OFFSET("SC_FP_CW", cw);
  39. SC_FP_OFFSET("SC_FP_SW", sw);
  40. SC_FP_OFFSET("SC_FP_TAG", tag);
  41. SC_FP_OFFSET("SC_FP_IPOFF", ipoff);
  42. SC_FP_OFFSET("SC_FP_CSSEL", cssel);
  43. SC_FP_OFFSET("SC_FP_DATAOFF", dataoff);
  44. SC_FP_OFFSET("SC_FP_DATASEL", datasel);
  45. SC_FP_OFFSET_PTR("SC_FP_ST", _st, "struct _fpstate");
  46. SC_FP_OFFSET_PTR("SC_FXSR_ENV", _fxsr_env, "void");
  47. return(0);
  48. }