[PATCH 02/10] drm/radeon: UVD bringup v7

Jerome Glisse j.glisse at gmail.com
Wed Apr 3 10:10:54 PDT 2013


On Wed, Apr 03, 2013 at 05:53:55PM +0200, Christian König wrote:
> Am 03.04.2013 16:53, schrieb Jerome Glisse:
> >On Wed, Apr 03, 2013 at 01:18:31AM +0200, Christian König wrote:
> >>[SNIP]
> >>
> >>  /* hardcode those limit for now */
> >>  #define RADEON_VA_IB_OFFSET			(1 << 20)
> >>  #define RADEON_VA_RESERVED_SIZE			(8 << 20)
> >>@@ -357,8 +360,9 @@ struct radeon_bo_list {
> >>  	struct ttm_validate_buffer tv;
> >>  	struct radeon_bo	*bo;
> >>  	uint64_t		gpu_offset;
> >>-	unsigned		rdomain;
> >>-	unsigned		wdomain;
> >>+	bool			written;
> >>+	unsigned		domain;
> >>+	unsigned		alt_domain;
> >>  	u32			tiling_flags;
> >>  };
> >I think that the change to the rdomain/wdomain should be in a patch
> >of its own. I think the change is fine but we had issue with change
> >that touched that part previously, would make bisecting and
> >understanding the change implication easier.
> 
> Agree, I actually planed to do so, but for the whole IP review stuff
> we needed to maintain a more or less stable patch base. Long story,
> but I'm going to change it.
> 
> >>@@ -826,7 +830,6 @@ struct radeon_cs_reloc {
> >>  	struct radeon_bo		*robj;
> >>  	struct radeon_bo_list		lobj;
> >>  	uint32_t			handle;
> >>-	uint32_t			flags;
> >>  };
> >Why removing the flags ? iirc it's not really use right now but i
> >remember plan to use it.
> 
> Ups, just a rebasing artifact. But when it's unused we should remove
> it, probably just not in this patch.
> 
> >>[SNIP]
> >>
> >>+static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p, int data0, int data1)
> >>+{
> >>+	struct radeon_cs_chunk *relocs_chunk;
> >>+	struct radeon_cs_reloc *reloc;
> >>+	unsigned idx, cmd;
> >>+	uint64_t start, end;
> >>+
> >>+	relocs_chunk = &p->chunks[p->chunk_relocs_idx];
> >>+	idx = radeon_get_ib_value(p, data1);
> >>+	if (idx >= relocs_chunk->length_dw) {
> >>+		DRM_ERROR("Relocs at %d after relocations chunk end %d !\n",
> >>+			  idx, relocs_chunk->length_dw);
> >>+		return -EINVAL;
> >>+	}
> >>+
> >>+	reloc = p->relocs_ptr[(idx / 4)];
> >>+	start = reloc->lobj.gpu_offset;
> >>+	end = start + radeon_bo_size(reloc->robj);
> >>+	start += radeon_get_ib_value(p, data0);
> >I am assuming there is no way for you to know the size that the uvd engine will write to ?
> >You are not checking anything on uvd possibly overwritting after the bo end.
> 
> Yeah that gave me headache for a quite long time, too. The problem
> is to figure out how much is actually written you need to keep track
> of the whole lot of informations including the UVD session,
> create/decode/destroy messages and allot of fiddling with the codec
> specific parameters.
> 
> And if I understand the UVD internals correctly even if we check
> everything there is no guarantee that a special crafted bitstream
> could not let UVD to write over the end of the buffer....
> 
> Is it ok if we but a big TODO on it for the initial patch?
> 
> Cheers,
> Christian.

I think i only need one assurance and i think for uvd this will be the case.
If UVD block write past bo end can you be sure that no matter what it will
overwritte to address > start ie it could not overwritte to begining of VRAM.

I have big doubt on that given the 256M window, i fear that it might go back
to writting to begining of memory where the page table is.

Note that i think that now that we have cp dma pagetable entry update we can
probably just move the pagetable to end of vram on 90% GPU with UVD this will
be > 256M which seems like a zone where UVD can never write.

If we can have such assurance i guess we can make uvd as an option and make
a very explicit comment stating that UVD engine can be use as an exploit
vector path.

Cheers,
Jerome


More information about the dri-devel mailing list