Mesa (master): radv: enable the trap handler and configure the shader exceptions

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Aug 24 11:20:45 UTC 2020


Module: Mesa
Branch: master
Commit: 8e97a61cfbb50e427159877a2b8110ec0f5ce8ef
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8e97a61cfbb50e427159877a2b8110ec0f5ce8ef

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Tue Aug 18 08:49:11 2020 +0200

radv: enable the trap handler and configure the shader exceptions

When TRAP_PRESENT is not enabled, all traps and exceptions are ignored.
Only EXCP_EN.mem_viol is currently supported because the other
exceptions have to be tested/validated first.

EXCP_EN.mem_viol is used to detect any sort of invalid memory
access like VM fault. When a memory violation is reported, the
hw jumps to the trap handler.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6384>

---

 src/amd/vulkan/radv_shader.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 8d0cd9d4feb..5ca57e045e4 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -805,12 +805,13 @@ radv_get_shader_binary_size(size_t code_size)
 	return code_size + DEBUGGER_NUM_MARKERS * 4;
 }
 
-static void radv_postprocess_config(const struct radv_physical_device *pdevice,
+static void radv_postprocess_config(const struct radv_device *device,
 				    const struct ac_shader_config *config_in,
 				    const struct radv_shader_info *info,
 				    gl_shader_stage stage,
 				    struct ac_shader_config *config_out)
 {
+	const struct radv_physical_device *pdevice = device->physical_device;
 	bool scratch_enabled = config_in->scratch_bytes_per_wave > 0;
 	unsigned vgpr_comp_cnt = 0;
 	unsigned num_input_vgprs = info->num_input_vgprs;
@@ -836,6 +837,15 @@ static void radv_postprocess_config(const struct radv_physical_device *pdevice,
 	config_out->rsrc2 = S_00B12C_USER_SGPR(info->num_user_sgprs) |
 			    S_00B12C_SCRATCH_EN(scratch_enabled);
 
+	if (device->trap_handler_shader) {
+		/* Enable the trap handler if requested and configure the
+		 * shader exceptions like memory violation, etc.
+		 * TODO: Enable (and validate) more exceptions.
+		 */
+		config_out->rsrc2 |= S_00B12C_TRAP_PRESENT(1) |
+				     S_00B12C_EXCP_EN(1 << 8); /* mem_viol */
+	}
+
 	if (!pdevice->use_ngg_streamout) {
 		config_out->rsrc2 |= S_00B12C_SO_BASE0_EN(!!info->so.strides[0]) |
 				     S_00B12C_SO_BASE1_EN(!!info->so.strides[1]) |
@@ -1108,7 +1118,7 @@ radv_shader_variant_create(struct radv_device *device,
 	}
 
 	variant->info = binary->info;
-	radv_postprocess_config(device->physical_device, &config, &binary->info,
+	radv_postprocess_config(device, &config, &binary->info,
 				binary->stage, &variant->config);
 
 	void *dest_ptr = radv_alloc_shader_memory(device, variant);



More information about the mesa-commit mailing list