@@ -887,6 +887,63 @@ static int cmd_unset(int argc, char *argv[]) {
887887}
888888CTSHELL_EXPORT_CMD (unset , cmd_unset , "Unset a variable" , CTSHELL_ATTR_NONE );
889889
890+ static int cmd_hexdump (int argc , char * argv []) {
891+ #ifdef CONFIG_CTSHELL_ENABLE_FUZZING
892+ // FIXME: remove this from user code
893+ return 0 ;
894+ #endif
895+ if (argc != 3 ) {
896+ ctshell_printf ("Usage: hexdump <base> <len>\r\n" );
897+ return 0 ;
898+ }
899+
900+ char * end_base = NULL ;
901+ char * end_len = NULL ;
902+ uintptr_t base = (uintptr_t ) strtoull (argv [1 ], & end_base , 0 );
903+ unsigned long length = strtoul (argv [2 ], & end_len , 0 );
904+
905+ if (!argv [1 ][0 ] || !argv [2 ][0 ] || * end_base != '\0' || * end_len != '\0' ) {
906+ ctshell_printf ("hexdump: invalid base or length\r\n" );
907+ return 0 ;
908+ }
909+ if (length == 0 ) {
910+ return 0 ;
911+ }
912+
913+ const unsigned char * mem = (const unsigned char * ) base ;
914+ uintptr_t aligned_base = base & ~(uintptr_t ) 0x0F ;
915+ uintptr_t data_end = base + (uintptr_t ) length ;
916+ uintptr_t aligned_end = (data_end + 15U ) & ~(uintptr_t ) 0x0F ;
917+
918+ for (uintptr_t addr = aligned_base ; addr < aligned_end ; addr += 16U ) {
919+ ctshell_printf ("%08lX " , (unsigned long ) addr );
920+ for (size_t i = 0 ; i < 16 ; i ++ ) {
921+ uintptr_t cur = addr + i ;
922+ if (cur < base || cur >= data_end ) {
923+ ctshell_printf (" " );
924+ } else {
925+ ctshell_printf ("%02X " , mem [cur - base ]);
926+ }
927+ if (i == 7 ) {
928+ ctshell_printf (" " );
929+ }
930+ }
931+ ctshell_printf (" |" );
932+ for (size_t i = 0 ; i < 16 ; i ++ ) {
933+ uintptr_t cur = addr + i ;
934+ if (cur < base || cur >= data_end ) {
935+ ctshell_printf (" " );
936+ } else {
937+ unsigned char ch = mem [cur - base ];
938+ ctshell_printf ("%c" , isprint (ch ) ? ch : '.' );
939+ }
940+ }
941+ ctshell_printf ("|\r\n" );
942+ }
943+ return 0 ;
944+ }
945+ CTSHELL_EXPORT_CMD (hexdump , cmd_hexdump , "Display memory content in hex format" , CTSHELL_ATTR_NONE );
946+
890947#ifdef CONFIG_CTSHELL_USE_FS
891948static int cmd_ls (int argc , char * argv []) {
892949 CHECK_FS_READY ();
0 commit comments