[Mesa-dev] [PATCH v2 19/24] nvc0/ir: prevent out of bounds when no images are bound
Ilia Mirkin
imirkin at alum.mit.edu
Tue Apr 26 01:23:40 UTC 2016
On Mon, Apr 25, 2016 at 4:15 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.
>
> v2: make use of bld.getSSA()
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu> (v1)
For v2 as well.
> ---
> .../nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 21 +++++++++++++++++++--
> 1 file changed, 19 insertions(+), 2 deletions(-)
>
> 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 d2bd970..ee97f5d 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> @@ -1787,6 +1787,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
> @@ -1906,7 +1913,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()) {
> @@ -1919,7 +1925,7 @@ NVC0LoweringPass::handleSurfaceOpNVE4(TexInstruction *su)
> pred->getInsn()->src(1).mod = Modifier(NV50_IR_MOD_NOT);
> }
> }
> - Instruction *red = bld.mkOp(OP_ATOM, su->dType, su->getDef(0));
> + Instruction *red = bld.mkOp(OP_ATOM, su->dType, bld.getSSA());
> red->subOp = su->subOp;
> if (!gMemBase)
> gMemBase = bld.mkSymbol(FILE_MEMORY_GLOBAL, 0, TYPE_U32, 0);
> @@ -1928,7 +1934,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.getSSA(), bld.loadImm(NULL, 0));
> +
> + 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));
> +
> 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