Raw ramdumps without vmcoreinfo does not work currently
with pointer authentication enabled. The arm capability
array can be queried but that creates a dependency on
the bits identifying the capabilities. Add a machdep
option instead to mask the tags when PAC is enabled.

Signed-off-by: Vinayak Menon <[email protected]>
---
 arm64.c | 20 +++++++++++++++-----
 crash.8 |  1 +
 defs.h  |  1 +
 help.c  |  1 +
 4 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/arm64.c b/arm64.c
index 37aed07..5b59972 100644
--- a/arm64.c
+++ b/arm64.c
@@ -763,6 +763,8 @@ arm64_parse_machdep_arg_l(char *argstring, char *param, 
ulong *value)
                        *value = dtol(p, flags, &err);
                } else if (STRNEQ(argstring, "vabits_actual")) {
                        *value = dtol(p, flags, &err);
+               } else if (STRNEQ(argstring, "tag_mask")) {
+                       *value = htol(p, flags, &err);
                } else if (megabytes) {
                        *value = dtol(p, flags, &err);
                        if (!err)
@@ -796,7 +798,6 @@ arm64_parse_cmdline_args(void)
        for (index = 0; index < MAX_MACHDEP_ARGS; index++) {
                if (!machdep->cmdline_args[index])
                        break;
-
                if (!strstr(machdep->cmdline_args[index], "=")) {
                        error(WARNING, "ignoring --machdep option: %x\n",
                                machdep->cmdline_args[index]);
@@ -838,6 +839,12 @@ arm64_parse_cmdline_args(void)
                                        "setting vabits_actual to: %ld\n\n",
                                        machdep->machspec->VA_BITS_ACTUAL);
                                continue;
+                       } else if (arm64_parse_machdep_arg_l(arglist[i], 
"tag_mask",
+                               &machdep->machspec->tag_mask)) {
+                               error(NOTE,
+                                       "setting tag_mask to: %lx\n\n",
+                                       machdep->machspec->tag_mask);
+                               continue;
                        }
 
                        error(WARNING, "ignoring --machdep option: %s\n",
@@ -4124,16 +4131,19 @@ arm64_swp_offset(ulong pte)
 
 static void arm64_calc_KERNELPACMASK(void)
 {
-       ulong value;
+       ulong value = 0;
        char *string;
 
        if ((string = pc->read_vmcoreinfo("NUMBER(KERNELPACMASK)"))) {
                value = htol(string, QUIET, NULL);
                free(string);
-               machdep->machspec->CONFIG_ARM64_KERNELPACMASK = value;
-               if (CRASHDEBUG(1))
-                       fprintf(fp, "CONFIG_ARM64_KERNELPACMASK: %lx\n", value);
+       } else if (machdep->machspec->tag_mask) {
+               value = machdep->machspec->tag_mask;
        }
+
+       machdep->machspec->CONFIG_ARM64_KERNELPACMASK = value;
+       if (CRASHDEBUG(1))
+               fprintf(fp, "CONFIG_ARM64_KERNELPACMASK: %lx\n", value);
 }
 
 #endif  /* ARM64 */
diff --git a/crash.8 b/crash.8
index 5020ce1..de32bdb 100644
--- a/crash.8
+++ b/crash.8
@@ -289,6 +289,7 @@ ARM64:
   kimage_voffset=<kimage_voffset-value>
   max_physmem_bits=<value>
   vabits_actual=<value>
+  tag_mask=<value>
 X86:
   page_offset=<CONFIG_PAGE_OFFSET-value>
 .fi
diff --git a/defs.h b/defs.h
index 35b983a..d406f5f 100644
--- a/defs.h
+++ b/defs.h
@@ -3331,6 +3331,7 @@ struct machine_specific {
        ulong VA_START;
        ulong CONFIG_ARM64_KERNELPACMASK;
        ulong physvirt_offset;
+       ulong tag_mask;
 };
 
 struct arm64_stackframe {
diff --git a/help.c b/help.c
index 531f50a..7f619d5 100644
--- a/help.c
+++ b/help.c
@@ -182,6 +182,7 @@ char *program_usage_info[] = {
     "      kimage_voffset=<kimage_voffset-value>",
     "      max_physmem_bits=<value>",
     "      vabits_actual=<value>",
+    "      tag_mask=<value>",
     "    X86:",
     "      page_offset=<CONFIG_PAGE_OFFSET-value>",
     "",

--
Crash-utility mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/crash-utility

Reply via email to