[PATCH umr] Add 'disasm_early_term' option.

Tom St Denis tom.stdenis at amd.com
Tue Apr 10 16:46:23 UTC 2018


For UMDs that don't use the 0xBF9F0000 shader terminator marker this
option allows the disassembler to stop once it hits the first
s_endpgm opcode.

Signed-off-by: Tom St Denis <tom.stdenis at amd.com>
---
 doc/sphinx/source/basic.rst | 69 +++++++++++++++++++++++----------------------
 doc/umr.1                   |  5 ++++
 src/app/main.c              |  4 ++-
 src/lib/umr_llvm_disasm.c   |  4 ++-
 src/umr.h                   |  3 +-
 5 files changed, 49 insertions(+), 36 deletions(-)

diff --git a/doc/sphinx/source/basic.rst b/doc/sphinx/source/basic.rst
index 8d6db65aa88a..84bf35f38b39 100644
--- a/doc/sphinx/source/basic.rst
+++ b/doc/sphinx/source/basic.rst
@@ -104,39 +104,42 @@ comma separator.
 
 The options available are:
 
-+--------------+------------------------------------------------------------------------------+
-| **Option**   | **Description**                                                              |
-+--------------+------------------------------------------------------------------------------+
-| quiet        | Disable various informative outputs that are not required for functionality. |
-+--------------+------------------------------------------------------------------------------+
-| read_smc     | Enable scanning of SMC registers when issuing a --scan command               |
-+--------------+------------------------------------------------------------------------------+
-| bits         | Enables the display of bitfields when registers are presented                |
-+--------------+------------------------------------------------------------------------------+
-| bitsfull     | When printing bits use the full path to the bitfield                         |
-+--------------+------------------------------------------------------------------------------+
-| empty_log    | Empty MMIO tracer after reading it                                           |
-+--------------+------------------------------------------------------------------------------+
-| follow       | Tells --logscan to continually read the MMIO tracer                          |
-+--------------+------------------------------------------------------------------------------+
-| no_follow_ib | Instructs the --ring command to not follow IBs pointed to by the ring        |
-+--------------+------------------------------------------------------------------------------+
-| named        | Tells --read to print out the register name along with the value             |
-+--------------+------------------------------------------------------------------------------+
-| many         | Allows matching of register names openly.  Used with --read and implies the  |
-|              | *named* option.  For instance: '\*.dce100.CRTC' will match any register that |
-|              | contains the fragment 'CRTC' in it.                                          |
-+--------------+------------------------------------------------------------------------------+
-| use_pci      | Enables direct PCI access bypassing the kernels debugfs entries.             |
-+--------------+------------------------------------------------------------------------------+
-| use_colour   | Enables colourful output in various commands.  Also accepts use_color        |
-+--------------+------------------------------------------------------------------------------+
-| no_kernel    | Attempts to avoid kernel access methods.  Implies *use_pci*.                 |
-+--------------+------------------------------------------------------------------------------+
-| verbose      | Enables verbose output, for instance in VM decoding                          |
-+--------------+------------------------------------------------------------------------------+
-| halt_waves   | Halt active waves while reading wave status data                             |
-+--------------+------------------------------------------------------------------------------+
++-------------------+-------------------------------------------------------------------------+
+| **Option**        | **Description**                                                         |
++-------------------+-------------------------------------------------------------------------+
+| quiet             | Disable various informative outputs that are not required for           |
+|                   | functionality.                                                          |
++-------------------+-------------------------------------------------------------------------+
+| read_smc          | Enable scanning of SMC registers when issuing a --scan command          |
++-------------------+-------------------------------------------------------------------------+
+| bits              | Enables the display of bitfields when registers are presented           |
++-------------------+-------------------------------------------------------------------------+
+| bitsfull          | When printing bits use the full path to the bitfield                    |
++-------------------+-------------------------------------------------------------------------+
+| empty_log         | Empty MMIO tracer after reading it                                      |
++-------------------+-------------------------------------------------------------------------+
+| follow            | Tells --logscan to continually read the MMIO tracer                     |
++-------------------+-------------------------------------------------------------------------+
+| no_follow_ib      | Instructs the --ring command to not follow IBs pointed to by the ring   |
++-------------------+-------------------------------------------------------------------------+
+| named             | Tells --read to print out the register name along with the value        |
++-------------------+-------------------------------------------------------------------------+
+| many              | Allows matching of register names openly.  Used with --read and implies |
+|                   | the *named* option.  For instance: '\*.dce100.CRTC' will match any      |
+|                   | register that contains the fragment 'CRTC' in it.                       |
++-------------------+-------------------------------------------------------------------------+
+| use_pci           | Enables direct PCI access bypassing the kernels debugfs entries.        |
++-------------------+-------------------------------------------------------------------------+
+| use_colour        | Enables colourful output in various commands.  Also accepts use_color   |
++-------------------+-------------------------------------------------------------------------+
+| no_kernel         | Attempts to avoid kernel access methods.  Implies *use_pci*.            |
++-------------------+-------------------------------------------------------------------------+
+| verbose           | Enables verbose output, for instance in VM decoding                     |
++-------------------+-------------------------------------------------------------------------+
+| halt_waves        | Halt active waves while reading wave status data                        |
++-------------------+-------------------------------------------------------------------------+
+| disasm_early_term | Terminate disassembly early for UMDs that don't use 0xBF9F0000 marker   |
++-------------------+-------------------------------------------------------------------------+
 
 ------------------
 Device Information
diff --git a/doc/umr.1 b/doc/umr.1
index 991ac62a4d82..83706b887894 100644
--- a/doc/umr.1
+++ b/doc/umr.1
@@ -179,6 +179,11 @@ separated strings.  Options should be specified before --update or --force comma
 .B halt_waves
      Halt/resume all waves while reading wave status.
 
+.B disasm_early_term
+     Terminate shader disassembly when first s_endpgm is hit.  This is required for
+     older UMDs (or non-mesa UMDs) that don't use the quintuple 0xBF9F0000 to signal the true
+     end of a shader.
+
 .SH "Notes"
 
 - The "Waves" field in the DRM section of --top only works if GFX PG has been disabled.  Otherwise,
diff --git a/src/app/main.c b/src/app/main.c
index 4f5d4d093670..81ebc4c5bf42 100644
--- a/src/app/main.c
+++ b/src/app/main.c
@@ -111,6 +111,8 @@ static void parse_options(char *str)
 			options.verbose = 1;
 		} else if (!strcmp(option, "halt_waves")) {
 			options.halt_waves = 1;
+		} else if (!strcmp(option, "disasm_early_term")) {
+			options.disasm_early_term = 1;
 		} else if (!strcmp(option, "no_kernel")) {
 			options.no_kernel = 1;
 			options.use_pci = 1;
@@ -573,7 +575,7 @@ int main(int argc, char **argv)
 "\n\t--vm-disasm, -vdis [<vmid>@]<address> <size>"
 	"\n\t\tDisassemble 'size' bytes (in hex) from a given address (in hex).\n"
 "\n\t--option -O <string>[,<string>,...]\n\t\tEnable various flags: bits, bitsfull, empty_log, follow, no_follow_ib, named, many,"
-	"\n\t\tuse_pci, use_colour, read_smc, quiet, no_kernel, verbose, halt_waves.\n"
+	"\n\t\tuse_pci, use_colour, read_smc, quiet, no_kernel, verbose, halt_waves, disasm_early_term.\n"
 "\n\n", UMR_BUILD_VER, UMR_BUILD_REV);
 			exit(EXIT_SUCCESS);
 		} else {
diff --git a/src/lib/umr_llvm_disasm.c b/src/lib/umr_llvm_disasm.c
index 66d1093db58d..a4594a04db56 100644
--- a/src/lib/umr_llvm_disasm.c
+++ b/src/lib/umr_llvm_disasm.c
@@ -153,14 +153,16 @@ uint32_t umr_compute_shader_size(struct umr_asic *asic,
 		}
 		y += 4;
 		if (buf[x] == S_ENDPGM || buf[x] == S_ENDINV) {
-			++x;
 			lastendpgm = y - 4;
 			++endpgm_cnt;
 			if (endpgm_cnt == 5)
 				break;
+			if (asic->options.disasm_early_term)
+				break;
 		} else {
 			endpgm_cnt = 0;
 		}
+		++x;
 	}
 	if (endpgm_cnt == 5)
 		return y - 16; // remove last 4 endpgm's
diff --git a/src/umr.h b/src/umr.h
index 684fcd777ac3..7154db7bb2c3 100644
--- a/src/umr.h
+++ b/src/umr.h
@@ -191,7 +191,8 @@ struct umr_options {
 	    follow_ib,
 	    verbose,
 	    halt_waves,
-	    no_kernel;
+	    no_kernel,
+	    disasm_early_term;
 
 	union {
 		struct {
-- 
2.14.3



More information about the amd-gfx mailing list