On 2022-09-14 03:20, Yu, Mingli wrote:
From: Mingli Yu<[email protected]>

Add devmem 128-bit support [1].

We should merge to master as well but I don't think we need to enable devmem, especially in kirkstone.
If a user wants to do that, that's fine.

My notes:

I think that back-porting this commit is low risk since it only adds a new, non-default ability in a compatible manner and more importantly 'devmem' is NOT built by default. Therefore, other users are not affected by including this patch.

devmem is a small program that reads and writes from physical memory using /dev/mem.

Usage is:

$ busybox devmem --help
...
Usage: devmem ADDRESS [WIDTH [VALUE]]
Read/write from physical address
    ADDRESS    Address to act upon
    WIDTH    Width (8/16/...)
    VALUE    Data to be written

This commit adds 128 bit as a supported WIDTH.

The patch cherry-picks back to 1.35.0 *cleanly* and doesn't require pulling in any other commits. It *does add new functionality* but the patch is written such that if _/SIZEOF_INT128/_ isn't define, the code is practically unchanged.

There hasn't been a release of busybox since Dec 2021 so we should backport this patch to oe-core/master and oe-core/kirkstone.



[1]https://git.busybox.net/busybox/commit/?id=d432049f288c9acdc4a7caa729c68ceba3c5dca1

Signed-off-by: Mingli Yu<[email protected]>
---
  .../0001-devmem-add-128-bit-width.patch       | 128 ++++++++++++++++++
  meta/recipes-core/busybox/busybox/defconfig   |   2 +-
  meta/recipes-core/busybox/busybox_1.35.0.bb   |   1 +
  3 files changed, 130 insertions(+), 1 deletion(-)
  create mode 100644 
meta/recipes-core/busybox/busybox/0001-devmem-add-128-bit-width.patch

diff --git 
a/meta/recipes-core/busybox/busybox/0001-devmem-add-128-bit-width.patch 
b/meta/recipes-core/busybox/busybox/0001-devmem-add-128-bit-width.patch
new file mode 100644
index 0000000000..985e2bf1d9
--- /dev/null
+++ b/meta/recipes-core/busybox/busybox/0001-devmem-add-128-bit-width.patch
@@ -0,0 +1,128 @@
+From d432049f288c9acdc4a7caa729c68ceba3c5dca1 Mon Sep 17 00:00:00 2001
+From: Aaro Koskinen<[email protected]>
+Date: Thu, 25 Aug 2022 18:47:02 +0300
+Subject: [PATCH] devmem: add 128-bit width
+
+Add 128-bit width if the compiler provides the needed type.
+
+function                                             old     new   delta
+devmem_main                                          405     464     +59
+.rodata                                           109025  109043     +18
+------------------------------------------------------------------------------
+(add/remove: 0/0 grow/shrink: 2/0 up/down: 77/0)               Total: 77 bytes
+
+Upstream-Status: Backport 
[https://git.busybox.net/busybox/commit/?id=d432049f288c9acdc4a7caa729c68ceba3c5dca1]
+
+Signed-off-by: Aaro Koskinen<[email protected]>
+Signed-off-by: Aaro Koskinen<[email protected]>
+Signed-off-by: Denys Vlasenko<[email protected]>
+Signed-off-by: Mingli Yu<[email protected]>
+---
+ miscutils/devmem.c | 68 ++++++++++++++++++++++++++++++----------------
+ 1 file changed, 44 insertions(+), 24 deletions(-)
+
+diff --git a/miscutils/devmem.c b/miscutils/devmem.c
+index f9f0276bc..f21621bd6 100644
+--- a/miscutils/devmem.c
++++ b/miscutils/devmem.c
+@@ -29,7 +29,6 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
+ {
+       void *map_base, *virt_addr;
+       uint64_t read_result;
+-      uint64_t writeval = writeval; /* for compiler */
+       off_t target;
+       unsigned page_size, mapped_size, offset_in_page;
+       int fd;
+@@ -64,9 +63,6 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
+                       width = strchrnul(bhwl, (argv[2][0] | 0x20)) - bhwl;
+                       width = sizes[width];
+               }
+-              /* VALUE */
+-              if (argv[3])
+-                      writeval = bb_strtoull(argv[3], NULL, 0);
+       } else { /* argv[2] == NULL */
+               /* make argv[3] to be a valid thing to fetch */
+               argv--;
+@@ -96,28 +92,46 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
+       virt_addr = (char*)map_base + offset_in_page;
+
+       if (!argv[3]) {
+-              switch (width) {
+-              case 8:
+-                      read_result = *(volatile uint8_t*)virt_addr;
+-                      break;
+-              case 16:
+-                      read_result = *(volatile uint16_t*)virt_addr;
+-                      break;
+-              case 32:
+-                      read_result = *(volatile uint32_t*)virt_addr;
+-                      break;
+-              case 64:
+-                      read_result = *(volatile uint64_t*)virt_addr;
+-                      break;
+-              default:
+-                      bb_simple_error_msg_and_die("bad width");
++#ifdef __SIZEOF_INT128__
++              if (width == 128) {
++                      unsigned __int128 rd =
++                              *(volatile unsigned __int128 *)virt_addr;
++                      printf("0x%016llX%016llX\n",
++                              (unsigned long long)(uint64_t)(rd >> 64),
++                              (unsigned long long)(uint64_t)rd
++                      );
++              } else
++#endif
++              {
++                      switch (width) {
++                      case 8:
++                              read_result = *(volatile uint8_t*)virt_addr;
++                              break;
++                      case 16:
++                              read_result = *(volatile uint16_t*)virt_addr;
++                              break;
++                      case 32:
++                              read_result = *(volatile uint32_t*)virt_addr;
++                              break;
++                      case 64:
++                              read_result = *(volatile uint64_t*)virt_addr;
++                              break;
++                      default:
++                              bb_simple_error_msg_and_die("bad width");
++                      }
++//                    printf("Value at address 0x%"OFF_FMT"X (%p): 0x%llX\n",
++//                            target, virt_addr,
++//                            (unsigned long long)read_result);
++                      /* Zero-padded output shows the width of access just 
done */
++                      printf("0x%0*llX\n", (width >> 2), (unsigned long 
long)read_result);
+               }
+-//            printf("Value at address 0x%"OFF_FMT"X (%p): 0x%llX\n",
+-//                    target, virt_addr,
+-//                    (unsigned long long)read_result);
+-              /* Zero-padded output shows the width of access just done */
+-              printf("0x%0*llX\n", (width >> 2), (unsigned long 
long)read_result);
+       } else {
++              /* parse VALUE */
++#ifdef __SIZEOF_INT128__
++              unsigned __int128 writeval = strtoumax(argv[3], NULL, 0);
++#else
++              uint64_t writeval = bb_strtoull(argv[3], NULL, 0);
++#endif
+               switch (width) {
+               case 8:
+                       *(volatile uint8_t*)virt_addr = writeval;
+@@ -135,6 +149,12 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
+                       *(volatile uint64_t*)virt_addr = writeval;
+ //                    read_result = *(volatile uint64_t*)virt_addr;
+                       break;
++#ifdef __SIZEOF_INT128__
++              case 128:
++                      *(volatile unsigned __int128 *)virt_addr = writeval;
++//                    read_result = *(volatile uint64_t*)virt_addr;
++                      break;
++#endif
+               default:
+                       bb_simple_error_msg_and_die("bad width");
+               }
+--
+2.25.1
+
diff --git a/meta/recipes-core/busybox/busybox/defconfig 
b/meta/recipes-core/busybox/busybox/defconfig
index 5e1e1f5638..58d393ad87 100644
--- a/meta/recipes-core/busybox/busybox/defconfig
+++ b/meta/recipes-core/busybox/busybox/defconfig
@@ -782,7 +782,7 @@ CONFIG_FEATURE_CROND_DIR=""
  # CONFIG_DEVFSD_FG_NP is not set
  # CONFIG_DEVFSD_VERBOSE is not set
  # CONFIG_FEATURE_DEVFS is not set
-# CONFIG_DEVMEM is not set
+CONFIG_DEVMEM=y
As mentioned above, I don't think we need to enable DEVMEM but only

carry this small patch.

Thanks,

../Randy


  # CONFIG_FBSPLASH is not set
  # CONFIG_FLASH_ERASEALL is not set
  # CONFIG_FLASH_LOCK is not set
diff --git a/meta/recipes-core/busybox/busybox_1.35.0.bb 
b/meta/recipes-core/busybox/busybox_1.35.0.bb
index edf896485e..e9ca6fdb1a 100644
--- a/meta/recipes-core/busybox/busybox_1.35.0.bb
+++ b/meta/recipes-core/busybox/busybox_1.35.0.bb
@@ -50,6 +50,7 @@ SRC_URI ="https://busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \ file://0001-libbb-sockaddr2str-ensure-only-printable-characters-.patch \ file://0002-nslookup-sanitize-all-printed-strings-with-printable.patch \ file://CVE-2022-30065.patch \ + file://0001-devmem-add-128-bit-width.patch \ "
  SRC_URI:append:libc-musl =" file://musl.cfg "



--
# Randy MacLeod
# Wind River Linux
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#170658): 
https://lists.openembedded.org/g/openembedded-core/message/170658
Mute This Topic: https://lists.openembedded.org/mt/93673250/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to