busybox-devmem.patch 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. From 351ef7188a1a2e2f154bbda6f703c2d3f4af6d79 Mon Sep 17 00:00:00 2001
  2. From: Denys Vlasenko <vda.linux@googlemail.com>
  3. Date: Wed, 14 Apr 2010 13:37:25 -0700
  4. Subject: [PATCH] devmem: map two pages only if it is necessary
  5. function old new delta
  6. devmem_main 463 469 +6
  7. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
  8. ---
  9. miscutils/devmem.c | 21 ++++++++++++++-------
  10. 1 files changed, 14 insertions(+), 7 deletions(-)
  11. diff --git a/miscutils/devmem.c b/miscutils/devmem.c
  12. index e13dedc..39b5808 100644
  13. --- a/miscutils/devmem.c
  14. +++ b/miscutils/devmem.c
  15. @@ -13,9 +13,9 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
  16. uint64_t read_result;
  17. uint64_t writeval = writeval; /* for compiler */
  18. off_t target;
  19. - unsigned page_size = getpagesize();
  20. + unsigned page_size, mapped_size, offset_in_page;
  21. int fd;
  22. - int width = 8 * sizeof(int);
  23. + unsigned width = 8 * sizeof(int);
  24. /* devmem ADDRESS [WIDTH [VALUE]] */
  25. // TODO: options?
  26. @@ -50,15 +50,22 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
  27. if (argv[3])
  28. writeval = bb_strtoull(argv[3], NULL, 0);
  29. } else { /* argv[2] == NULL */
  30. - /* make argv[3] to be a valid thing to use */
  31. + /* make argv[3] to be a valid thing to fetch */
  32. argv--;
  33. }
  34. if (errno)
  35. - bb_show_usage(); /* bb_strtouXX failed */
  36. + bb_show_usage(); /* one of bb_strtouXX failed */
  37. fd = xopen("/dev/mem", argv[3] ? (O_RDWR | O_SYNC) : (O_RDONLY | O_SYNC));
  38. + mapped_size = page_size = getpagesize();
  39. + offset_in_page = (unsigned)target & (page_size - 1);
  40. + if (offset_in_page + width > page_size) {
  41. + /* This access spans pages.
  42. + * Must map two pages to make it possible: */
  43. + mapped_size *= 2;
  44. + }
  45. map_base = mmap(NULL,
  46. - page_size * 2 /* in case value spans page */,
  47. + mapped_size,
  48. argv[3] ? (PROT_READ | PROT_WRITE) : PROT_READ,
  49. MAP_SHARED,
  50. fd,
  51. @@ -68,7 +75,7 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
  52. // printf("Memory mapped at address %p.\n", map_base);
  53. - virt_addr = (char*)map_base + (target & (page_size - 1));
  54. + virt_addr = (char*)map_base + offset_in_page;
  55. if (!argv[3]) {
  56. switch (width) {
  57. @@ -119,7 +126,7 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
  58. }
  59. if (ENABLE_FEATURE_CLEAN_UP) {
  60. - if (munmap(map_base, page_size * 2) == -1)
  61. + if (munmap(map_base, mapped_size) == -1)
  62. bb_perror_msg_and_die("munmap");
  63. close(fd);
  64. }
  65. --
  66. 1.7.1