unsigned long stack;
unsigned long smap_pss, smap_swap;
unsigned long smap_size;
- unsigned long smap_start;
+ // For mixed 32/64 userspace, 32-bit pmap still needs
+ // 64-bit field here to correctly show 64-bit processes:
+ unsigned long long smap_start;
+ // (strictly speaking, other fields need to be wider too,
+ // but they are in kbytes, not bytes, and they hold sizes,
+ // not start addresses, sizes tend to be less than 4 terabytes)
char smap_mode[5];
char *smap_name;
};
}
#if ENABLE_FEATURE_TOPMEM || ENABLE_PMAP
-static unsigned long fast_strtoul_16(char **endptr)
+static unsigned long long fast_strtoull_16(char **endptr)
{
unsigned char c;
char *str = *endptr;
- unsigned long n = 0;
+ unsigned long long n = 0;
/* Need to stop on both ' ' and '\n' */
while ((c = *str++) > ' ') {
*tp = ' ';
tp = buf;
- currec.smap_start = fast_strtoul_16(&tp);
- currec.smap_size = (fast_strtoul_16(&tp) - currec.smap_start) >> 10;
+ currec.smap_start = fast_strtoull_16(&tp);
+ currec.smap_size = (fast_strtoull_16(&tp) - currec.smap_start) >> 10;
strncpy(currec.smap_mode, tp, sizeof(currec.smap_mode)-1);
# define DASHES "--------"
#endif
+#if ULLONG_MAX == 0xffffffff
+# define AFMTLL "8"
+#else
+# define AFMTLL "16"
+#endif
+
enum {
OPT_x = 1 << 0,
OPT_q = 1 << 1,
{
unsigned opt = (uintptr_t)data;
- printf("%0" AFMT "lx ", currec->smap_start);
+ printf("%0" AFMTLL "llx ", currec->smap_start);
if (opt & OPT_x)
printf("%7lu %7lu %7lu %7lu ",