lkmc.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /* https://github.com/cirosantilli/linux-kernel-module-cheat#lkmc-c */
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <lkmc.h>
  7. #define LKMC_ASSERT_EQ_DEFINE(bits) \
  8. LKMC_ASSERT_EQ_DECLARE(bits) \
  9. { \
  10. if (val1 != val2) { \
  11. printf("%s failed\n", __func__); \
  12. printf("val1 0x%" PRIX ## bits "\n", val1); \
  13. printf("val2 0x%" PRIX ## bits "\n", val2); \
  14. lkmc_assert_fail(line); \
  15. } \
  16. }
  17. LKMC_ASSERT_EQ_DEFINE(32)
  18. LKMC_ASSERT_EQ_DEFINE(64)
  19. #undef ASSERT_EQ_DEFINE
  20. void lkmc_assert_fail(uint32_t line) {
  21. printf("error: assertion failed at line: %" PRIu32 "\n", line);
  22. abort();
  23. }
  24. void lkmc_assert_memcmp(
  25. const void *s1,
  26. const void *s2,
  27. size_t n,
  28. uint32_t line
  29. ) {
  30. size_t i;
  31. uint8_t *s1b, *s2b;
  32. uint8_t b1, b2;
  33. s1b = (uint8_t *)s1;
  34. s2b = (uint8_t *)s2;
  35. for (i = 0; i < n; ++i) {
  36. b1 = s1b[i];
  37. b2 = s2b[i];
  38. if (b1 != b2) {
  39. printf(
  40. "%s failed: "
  41. "byte1, byte2, index: "
  42. "0x%02" PRIX8 " 0x%02" PRIX8 " 0x%zX\n",
  43. __func__,
  44. b1,
  45. b2,
  46. i
  47. );
  48. lkmc_assert_fail(line);
  49. }
  50. }
  51. }
  52. #if defined(__aarch64__)
  53. #define LKMC_SYSREG_READ_WRITE(type, name) \
  54. type LKMC_CONCAT(LKMC_CONCAT(LKMC_SYSREG_SYMBOL_PREFIX, name), _read(void)) { \
  55. type name; \
  56. __asm__ __volatile__("mrs %0, " #name : "=r" (name) : : ); \
  57. return name; \
  58. } \
  59. void LKMC_CONCAT(LKMC_CONCAT(LKMC_SYSREG_SYMBOL_PREFIX, name), _write(type name)) { \
  60. __asm__ __volatile__("msr " #name ", %0" : : "r" (name) : ); \
  61. }
  62. LKMC_SYSREG_OPS
  63. #undef LKMC_SYSREG_READ_WRITE
  64. #endif