[Mesa-dev] [RFC 20/24] nvc0/ir: prevent out of bounds when no images are bound
Samuel Pitoiset
samuel.pitoiset at gmail.com
Thu Apr 14 22:13:28 UTC 2016
On 04/13/2016 10:44 PM, Ilia Mirkin wrote:
> On Tue, Apr 12, 2016 at 7:57 PM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>> Checking if the image address is not 0 should be enough to prevent
>> read faults. To improve robustness, make sure that the destination
>> value of atomic operations is correctly initialized in case the
>> instruction is not performed.
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>> .../drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 19 ++++++++++++++++++-
>> 1 file changed, 18 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
>> index bd7e4bd..253084e 100644
>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
>> @@ -1774,6 +1774,13 @@ NVC0LoweringPass::processSurfaceCoordsNVE4(TexInstruction *su)
>> su->setSrc(0, addr);
>> su->setSrc(1, v);
>> su->setSrc(2, pred);
>> +
>> + // prevent read fault when the image is not actually bound
>> + CmpInstruction *pred1 =
>> + bld.mkCmp(OP_SET, CC_EQ, TYPE_U32, bld.getSSA(1, FILE_PREDICATE),
>> + TYPE_U32, bld.mkImm(0),
>> + loadSuInfo32(ind, base + NVE4_SU_INFO_ADDR));
>> + su->setPredicate(CC_NOT_P, pred1->getDef(0));
>> }
>>
>> static DataType
>> @@ -1893,7 +1900,6 @@ NVC0LoweringPass::handleSurfaceOpNVE4(TexInstruction *su)
>> convertSurfaceFormat(su);
>>
>> if (su->op == OP_SUREDB || su->op == OP_SUREDP) {
>> - // FIXME: for out of bounds access, destination value will be undefined !
>> Value *pred = su->getSrc(2);
>> CondCode cc = CC_NOT_P;
>> if (su->getPredicate()) {
>> @@ -1915,7 +1921,18 @@ NVC0LoweringPass::handleSurfaceOpNVE4(TexInstruction *su)
>> if (su->subOp == NV50_IR_SUBOP_ATOM_CAS)
>> red->setSrc(2, su->getSrc(4));
>> red->setIndirect(0, 0, su->getSrc(0));
>> +
>> + // make sure to initialize dst value when the atomic operation is not
>> + // performed
>> + Instruction *mov = bld.mkMov(bld.getScratch(), bld.loadImm(NULL, 0));
>
> I tend to prefer bld.getSSA(). It's shorter.
>
>> +
>> + assert(cc == CC_NOT_P);
>> red->setPredicate(cc, pred);
>> + mov->setPredicate(CC_P, pred);
>> +
>> + bld.mkOp2(OP_UNION, TYPE_U32, su->getDef(0),
>> + red->getDef(0), mov->getDef(0));
>
> This will only work if red->getDef() != su->getDef()... make sure that
> red gets a fresh def (bld.getSSA())
This should not happen, but I will check.
>
> With that verified,
>
> Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
>
>> +
>> delete_Instruction(bld.getProgram(), su);
>> handleCasExch(red, true);
>> }
>> --
>> 2.8.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list