Ticket #13072: mesa-19.3.3-fix_svga_vmwgfx_segfaults-1.patch

File mesa-19.3.3-fix_svga_vmwgfx_segfaults-1.patch, 9.0 KB (added by Douglas R. Reno, 4 years ago)

Fix SVGA and VMWGFX segmentation faults that prevent X from starting

  • src/gallium/auxiliary/util/u_debug_flush.c

    Submitted By:            Douglas R. Reno <renodr at linuxfromscratch dot org>
    Date:                    2020-01-29
    Initial Package Version: 19.3.3
    Origin:                  Upstream (MR 3614) + Self
    Description:             Fixes a Xorg Segmentation Fault when using Xorg under
                             VMWare Workstation (or any device that uses the SVGA
                             driver). This also adapts it to driver changes in
                             Linux 5.3+ for allowing OpenGL 4.5/4.6/Vulkan 1.1 to
                             function in the VMWare DRM driver. This also fixes
                             several graphical glitches and bugs that have been
                             present since Mesa-19.2.0 (with the introduction of
                             OpenGL-4.5).
    
    diff -Naurp mesa-19.3.3.orig/src/gallium/auxiliary/util/u_debug_flush.c mesa-19.3.3/src/gallium/auxiliary/util/u_debug_flush.c
    old new  
    5151#include <stdio.h>
    5252
    5353/* Future improvement: Use realloc instead? */
    54 #define DEBUG_FLUSH_MAP_DEPTH 16
     54#define DEBUG_FLUSH_MAP_DEPTH 32
    5555
    5656struct debug_map_item {
    5757   struct debug_stack_frame *frame;
  • src/gallium/drivers/svga/svga_format.c

    diff -Naurp mesa-19.3.3.orig/src/gallium/drivers/svga/svga_format.c mesa-19.3.3/src/gallium/drivers/svga/svga_format.c
    old new static const struct vgpu10_format_entry  
    207207   [ PIPE_FORMAT_L32_SINT ] =              { SVGA3D_FORMAT_INVALID,      SVGA3D_FORMAT_INVALID,       SVGA3D_R32_SINT,             TF_XXX1 },
    208208   [ PIPE_FORMAT_L32A32_SINT ] =           { SVGA3D_FORMAT_INVALID,      SVGA3D_FORMAT_INVALID,       SVGA3D_R32G32_SINT,          TF_XXXY },
    209209   [ PIPE_FORMAT_R10G10B10A2_UINT ] =      { SVGA3D_R10G10B10A2_UINT,    SVGA3D_R10G10B10A2_UINT,     SVGA3D_R10G10B10A2_UINT,     0 },
     210   [ PIPE_FORMAT_COUNT ] = {SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0},
    210211};
    211212
    212213
  • src/gallium/drivers/svga/svga_pipe_blit.c

    diff -Naurp mesa-19.3.3.orig/src/gallium/drivers/svga/svga_pipe_blit.c mesa-19.3.3/src/gallium/drivers/svga/svga_pipe_blit.c
    old new svga_resource_copy_region(struct pipe_co  
    881881          try_blit(svga, &blit))
    882882         goto done;
    883883
    884       copy_region_fallback(svga, dst_tex, dst_level, dstx, dsty, dstz,
    885                            src_tex, src_level, src_box);
     884      if (!try_cpu_copy_region(svga, &blit)) {
     885         if (!try_blit(svga, &blit))
     886            debug_printf("Blit failed.\n");
     887      }
    886888   }
    887889
    888890done:
  • src/gallium/drivers/svga/svga_resource_texture.c

    diff -Naurp mesa-19.3.3.orig/src/gallium/drivers/svga/svga_resource_texture.c mesa-19.3.3/src/gallium/drivers/svga/svga_resource_texture.c
    old new svga_texture_transfer_map(struct pipe_co  
    531531   struct svga_transfer *st;
    532532   struct svga_winsys_surface *surf = tex->handle;
    533533   boolean use_direct_map = svga_have_gb_objects(svga) &&
    534                             !svga_have_gb_dma(svga);
     534        (!svga_have_gb_dma(svga) || (usage & PIPE_TRANSFER_WRITE));
    535535   void *map = NULL;
    536536   int64_t begin = svga_get_time(svga);
    537537
  • src/gallium/drivers/svga/svga_state_tgsi_transform.c

    diff -Naurp mesa-19.3.3.orig/src/gallium/drivers/svga/svga_state_tgsi_transform.c mesa-19.3.3/src/gallium/drivers/svga/svga_state_tgsi_transform.c
    old new emulate_point_sprite(struct svga_context  
    131131         tgsi_dump(new_tokens, 0);
    132132      }
    133133
    134       templ.tokens = new_tokens;
     134      pipe_shader_state_from_tgsi(&templ, new_tokens);
    135135      templ.stream_output.num_outputs = 0;
    136136
    137137      if (streamout) {
  • src/gallium/winsys/svga/drm/vmwgfx_drm.h

    diff -Naurp mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmwgfx_drm.h mesa-19.3.3/src/gallium/winsys/svga/drm/vmwgfx_drm.h
    old new extern "C" {  
    7171#define DRM_VMW_CREATE_EXTENDED_CONTEXT 26
    7272#define DRM_VMW_GB_SURFACE_CREATE_EXT   27
    7373#define DRM_VMW_GB_SURFACE_REF_EXT      28
     74#define DRM_VMW_MSG                     29
    7475
    7576/*************************************************************************/
    7677/**
    union drm_vmw_gb_surface_reference_ext_a  
    12131214        struct drm_vmw_surface_arg req;
    12141215};
    12151216
     1217/**
     1218 * struct drm_vmw_msg_arg
     1219 *
     1220 * @send: Pointer to user-space msg string (null terminated).
     1221 * @receive: Pointer to user-space receive buffer.
     1222 * @send_only: Boolean for whether this is only sending or receiving too.
     1223 *
     1224 * Argument to the DRM_VMW_MSG ioctl.
     1225 */
     1226struct drm_vmw_msg_arg {
     1227   __u64 send;
     1228   __u64 receive;
     1229   __s32 send_only;
     1230   __u32 receive_len;
     1231};
     1232
    12161233#if defined(__cplusplus)
    12171234}
    12181235#endif
  • src/gallium/winsys/svga/drm/vmw_msg.c

    diff -Naurp mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmw_msg.c mesa-19.3.3/src/gallium/winsys/svga/drm/vmw_msg.c
    old new  
    3131#include "pipe/p_defines.h"
    3232#include "svga_winsys.h"
    3333#include "vmw_msg.h"
     34#include "vmwgfx_drm.h"
     35#include "vmw_screen.h"
     36#include "xf86drm.h"
    3437
    3538
    3639#define MESSAGE_STATUS_SUCCESS  0x0001
    void  
    424427vmw_svga_winsys_host_log(struct svga_winsys_screen *sws, const char *log)
    425428{
    426429   struct rpc_channel channel;
     430   struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
    427431   char *msg;
    428432   int msg_len;
    429433   int ret;
    vmw_svga_winsys_host_log(struct svga_win  
    444448
    445449   sprintf(msg, "log %s", log);
    446450
    447    if (!(ret = vmw_open_channel(&channel, RPCI_PROTOCOL_NUM))) {
    448       ret = vmw_send_msg(&channel, msg);
    449       vmw_close_channel(&channel);
     451   if (vws->ioctl.have_drm_2_17) {
     452      struct drm_vmw_msg_arg msg_arg;
     453
     454      memset(&msg_arg, 0, sizeof(msg_arg));
     455      msg_arg.send = (uint64_t) (unsigned long) (msg);
     456      msg_arg.send_only = 1;
     457
     458      ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_MSG,
     459                                &msg_arg, sizeof(msg_arg));
     460   } else {
     461      if (!(ret = vmw_open_channel(&channel, RPCI_PROTOCOL_NUM))) {
     462         ret = vmw_send_msg(&channel, msg);
     463         vmw_close_channel(&channel);
     464      }
    450465   }
    451466
    452467   if (ret)
  • src/gallium/winsys/svga/drm/vmw_screen.h

    diff -Naurp mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmw_screen.h mesa-19.3.3/src/gallium/winsys/svga/drm/vmw_screen.h
    old new struct vmw_winsys_screen  
    7878      boolean have_drm_2_9;
    7979      uint32_t drm_execbuf_version;
    8080      boolean have_drm_2_15;
     81      boolean have_drm_2_16;
     82      boolean have_drm_2_17;
    8183   } ioctl;
    8284
    8385   struct {
  • src/gallium/winsys/svga/drm/vmw_screen_ioctl.c

    diff -Naurp mesa-19.3.3.orig/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c mesa-19.3.3/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c
    old new vmw_ioctl_region_map(struct vmw_region *  
    694694         return NULL;
    695695      }
    696696
     697      (void) madvise(map, region->size, MADV_HUGEPAGE);
    697698      region->data = map;
    698699   }
    699700
    vmw_ioctl_init(struct vmw_winsys_screen  
    973974   drmVersionPtr version;
    974975   boolean drm_gb_capable;
    975976   boolean have_drm_2_5;
    976    boolean have_drm_2_16;
    977977   const char *getenv_val;
    978978
    979979   VMW_FUNC;
    vmw_ioctl_init(struct vmw_winsys_screen  
    990990      (version->version_major == 2 && version->version_minor > 8);
    991991   vws->ioctl.have_drm_2_15 = version->version_major > 2 ||
    992992      (version->version_major == 2 && version->version_minor > 14);
    993    have_drm_2_16 = version->version_major > 2 ||
     993   vws->ioctl.have_drm_2_16 = version->version_major > 2 ||
    994994      (version->version_major == 2 && version->version_minor > 15);
     995   vws->ioctl.have_drm_2_17 = version->version_major > 2 ||
     996      (version->version_major == 2 && version->version_minor > 16);
    995997
    996998   vws->ioctl.drm_execbuf_version = vws->ioctl.have_drm_2_9 ? 2 : 1;
    997999
    vmw_ioctl_init(struct vmw_winsys_screen  
    11161118      else
    11171119         vws->ioctl.num_cap_3d = SVGA3D_DEVCAP_MAX;
    11181120
    1119       if (have_drm_2_16) {
     1121      if (vws->ioctl.have_drm_2_16) {
    11201122         vws->base.have_coherent = TRUE;
    11211123         getenv_val = getenv("SVGA_FORCE_COHERENT");
    11221124         if (getenv_val && strcmp(getenv_val, "0") != 0)