NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: xsrc/58133: X server crashes; radeon 5450; modesetting



The following reply was made to PR xsrc/58133; it has been noted by GNATS.

From: Rhialto <rhialto%falu.nl@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: xsrc-manager%netbsd.org@localhost, gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost,
	Rhialto <rhialto%falu.nl@localhost>
Subject: Re: xsrc/58133: X server crashes; radeon 5450; modesetting
Date: Sun, 5 May 2024 15:02:06 +0200

 After some experiments with difficulty, I found out less than I wanted
 and just got more confused in some respects.
 
 With Driver "modesetting", the segv is in glamor_text() in
 xsrc/external/mit/xorg-server/dist/glamor/glamor_text.c, which calls
 glamor_get_vbo_space() in
 xsrc/external/mit/xorg-server/dist/glamor/glamor_vbo.c. This ends up in
 /usr/X11R7/lib/modules/libglamoregl.so. I could get debugging output
 from there. It shows that the "vbo" (video buffer object, I presume)
 indeed gets filled up and restarted from the beginning pretty quickly,
 so when the segmentation violation happens with vbo_offset == 0, it must
 be the Nth time that this state occurs.
 
 A call there to glMapBufferRange() appears to be responsible for memory
 mapping. When chasing SIGSEGVs this would be a first suspect. But
 finding out to which source code this calls is nontrivial, since it
 seems that GL internally has lots of similar versions of the same thing,
 and a dispatcher that somehow chooses between options.
 
 It seemed that a function annotated "* Called via glMapBuffer() and
 glMapBufferRange()", named radeonMapBufferRange() in
 ./usr/xsrc/external/mit/MesaLib/dist/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c
 would be a good candidate, which in turn would seem to refer to bo_map()
 in xsrc/external/mit/libdrm/dist/radeon/radeon_bo.c. However, this
 location is NOT reached with Driver "modesetting".
 
 With Driver "radeon", it does reach bo_map() but not glamor_get_vbo_space().
 
 To make things more confusing: if you do not have a xorg.conf file, X
 doesn't choose "modesetting_drv" as a default driver. It doesn't even
 choose "radeon_drv", but "ati_drv":
 
 [   845.672] (==) Using default built-in configuration (39 lines)
 [   845.672] (==) --- Start of built-in configuration ---
 [   845.672] 	Section "Device"
 [   845.672] 		Identifier	"Builtin Default ati Device 0"
 [   845.672] 		Driver	"ati"
 [   845.672] 	EndSection
 [   845.672] 	Section "Screen"
 [   845.672] 		Identifier	"Builtin Default ati Screen 0"
 [   845.672] 		Device	"Builtin Default ati Device 0"
 [   845.672] 	EndSection
 ...
 [   845.672] 	Section "ServerLayout"
 [   845.672] 		Identifier	"Builtin Default Layout"
 [   845.672] 		Screen	"Builtin Default ati Screen 0"
 [   845.672] 		Screen	"Builtin Default modesetting Screen 0"
 [   845.672] 		Screen	"Builtin Default vesa Screen 0"
 [   845.672] 		Screen	"Builtin Default wsfb Screen 0"
 [   845.672] 	EndSection
 [   845.672] (==) --- End of built-in configuration ---
 ...
 
 confusingly, it labels most of its output with (II) RADEON: 
 
 [   845.738] (II) RADEON(0): Creating default Display subsection in Screen section
 	"Builtin Default ati Screen 0" for depth/fbbpp 24/32
 [   845.738] (==) RADEON(0): Depth 24, (--) framebuffer bpp 32
 [   845.738] (II) RADEON(0): Pixel depth = 24 bits stored in 4 bytes (32 bpp pixmaps)
 [   845.738] (==) RADEON(0): Default visual is TrueColor
 [   845.738] (==) RADEON(0): RGB weight 888
 [   845.738] (II) RADEON(0): Using 8 bits per RGB (8 bit DAC)
 [   845.738] (--) RADEON(0): Chipset: "ATI Radeon HD 5450" (ChipID = 0x68f9)
 
 however this driver actually logs the precise chipset, which I think the
 "radeon_drv" doesn't do.
 
 The ati_drv is smaller than the radeon_drv and links to fewer other
 libraries (in particular not libglapi, but both do link to libdrm_radeon
 where bo_map() is).
 
 I'm trying the reliability of the "ati_drv" now.
 
 However I would still like to know what code there is behind
 glMapBufferRange(). It seems that this may be a key to the root cause of
 the segv. Without working single stepping in gdb this seems hard to find
 out though.
 


Home | Main Index | Thread Index | Old Index