main.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /* This is the main entry point for all .S examples.
  2. * https://github.com/cirosantilli/linux-kernel-module-cheat#userland-assembly-c-standard-library
  3. */
  4. #include <stdio.h>
  5. #include <stdint.h>
  6. #include <lkmc.h>
  7. int asm_main(uint32_t *line);
  8. #define ASSERT_EQ_DEFINE(bits) \
  9. int assert_eq_ ## bits(uint ## bits ## _t val1, uint ## bits ## _t val2) { \
  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. return 1; \
  15. } \
  16. return 0; \
  17. }
  18. ASSERT_EQ_DEFINE(32)
  19. ASSERT_EQ_DEFINE(64)
  20. int assert_memcmp(const void *s1, const void *s2, size_t n) {
  21. int ret;
  22. size_t i;
  23. uint8_t *s1b, *s2b;
  24. uint8_t b1, b2;
  25. ret = 0;
  26. s1b = (uint8_t *)s1;
  27. s2b = (uint8_t *)s2;
  28. for (i = 0; i < n; ++i) {
  29. b1 = s1b[i];
  30. b2 = s2b[i];
  31. if (b1 != b2) {
  32. printf(
  33. "%s failed: "
  34. "byte1, byte2, index: "
  35. "0x%02" PRIX8 " 0x%02" PRIX8 " 0x%zX\n",
  36. __func__,
  37. b1,
  38. b2,
  39. i
  40. );
  41. ret = 1;
  42. }
  43. }
  44. return ret;
  45. }
  46. int main(void) {
  47. uint32_t ret, line;
  48. ret = asm_main(&line);
  49. if (ret) {
  50. printf("error: asm_main returned %d at line %d\n", ret, line);
  51. }
  52. return ret;
  53. }