diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-10-07 22:41:02 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-10-07 22:41:02 +0100 |
commit | 1a5d5b9ae5771d81da16222582acedb1557386c8 (patch) | |
tree | c018bb3a9dcbbbff32abc6461c81bcd0982f5c93 /src | |
parent | b41ecda69f2e6c9f8adf79dd24ded45740bcc015 (diff) |
sna: Check that for batch overflows after advancing a BLT
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src')
-rw-r--r-- | src/sna/kgem.h | 5 | ||||
-rw-r--r-- | src/sna/sna_blt.c | 31 | ||||
-rw-r--r-- | src/sna/sna_io.c | 6 |
3 files changed, 32 insertions, 10 deletions
diff --git a/src/sna/kgem.h b/src/sna/kgem.h index 06f39992..e547215b 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -352,16 +352,21 @@ static inline void _kgem_set_mode(struct kgem *kgem, enum kgem_mode mode) static inline bool kgem_check_batch(struct kgem *kgem, int num_dwords) { + assert(num_dwords > 0); + assert(kgem->nbatch < kgem->surface); + assert(kgem->surface <= kgem->batch_size); return likely(kgem->nbatch + num_dwords + KGEM_BATCH_RESERVED <= kgem->surface); } static inline bool kgem_check_reloc(struct kgem *kgem, int n) { + assert(kgem->nreloc <= KGEM_RELOC_SIZE(kgem)); return likely(kgem->nreloc + n <= KGEM_RELOC_SIZE(kgem)); } static inline bool kgem_check_exec(struct kgem *kgem, int n) { + assert(kgem->nexec <= KGEM_EXEC_SIZE(kgem)); return likely(kgem->nexec + n <= KGEM_EXEC_SIZE(kgem)); } diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c index 94b5f4a7..c3c47357 100644 --- a/src/sna/sna_blt.c +++ b/src/sna/sna_blt.c @@ -84,6 +84,7 @@ static const uint8_t fill_ROP[] = { static void nop_done(struct sna *sna, const struct sna_composite_op *op) { + assert(sna->kgem.nbatch <= KGEM_BATCH_SIZE(&sna->kgem)); (void)sna; (void)op; } @@ -97,7 +98,9 @@ static void gen6_blt_copy_done(struct sna *sna, const struct sna_composite_op *o b[0] = XY_SETUP_CLIP; b[1] = b[2] = 0; kgem->nbatch += 3; + assert(kgem->nbatch < kgem->surface); } + assert(sna->kgem.nbatch <= KGEM_BATCH_SIZE(&sna->kgem)); (void)op; } @@ -143,8 +146,8 @@ static bool sna_blt_fill_init(struct sna *sna, blt->bpp = bpp; kgem_set_mode(kgem, KGEM_BLT); - if (!kgem_check_bo_fenced(kgem, bo) || - !kgem_check_batch(kgem, 12)) { + if (!kgem_check_batch(kgem, 12) || + !kgem_check_bo_fenced(kgem, bo)) { _kgem_submit(kgem); assert(kgem_check_bo_fenced(kgem, bo)); _kgem_set_mode(kgem, KGEM_BLT); @@ -178,6 +181,7 @@ static bool sna_blt_fill_init(struct sna *sna, b[7] = 0; b[8] = 0; kgem->nbatch += 9; + assert(kgem->nbatch < kgem->surface); sna->blt_state.fill_bo = bo->unique_id; sna->blt_state.fill_pixel = pixel; @@ -236,6 +240,7 @@ inline static void sna_blt_fill_one(struct sna *sna, b = kgem->batch + kgem->nbatch; kgem->nbatch += 3; + assert(kgem->nbatch < kgem->surface); b[0] = blt->cmd; b[1] = y << 16 | x; @@ -369,7 +374,8 @@ static void sna_blt_alpha_fixup_one(struct sna *sna, assert(width > 0); assert(height > 0); - if (!kgem_check_batch(kgem, 12) || !kgem_check_reloc(kgem, 2)) { + if (!kgem_check_batch(kgem, 12) || + !kgem_check_reloc(kgem, 2)) { _kgem_submit(kgem); _kgem_set_mode(kgem, KGEM_BLT); } @@ -397,6 +403,7 @@ static void sna_blt_alpha_fixup_one(struct sna *sna, b[10] = 0; b[11] = 0; kgem->nbatch += 12; + assert(kgem->nbatch < kgem->surface); } static void sna_blt_copy_one(struct sna *sna, @@ -442,7 +449,8 @@ static void sna_blt_copy_one(struct sna *sna, return; } - if (!kgem_check_batch(kgem, 8) || !kgem_check_reloc(kgem, 2)) { + if (!kgem_check_batch(kgem, 8) || + !kgem_check_reloc(kgem, 2)) { _kgem_submit(kgem); _kgem_set_mode(kgem, KGEM_BLT); } @@ -466,6 +474,7 @@ static void sna_blt_copy_one(struct sna *sna, KGEM_RELOC_FENCED, 0); kgem->nbatch += 8; + assert(kgem->nbatch < kgem->surface); } bool @@ -839,6 +848,7 @@ inline static void _sna_blt_fill_box(struct sna *sna, b = kgem->batch + kgem->nbatch; kgem->nbatch += 3; + assert(kgem->nbatch < kgem->surface); b[0] = blt->cmd; *(uint64_t *)(b+1) = *(const uint64_t *)box; @@ -868,6 +878,7 @@ inline static void _sna_blt_fill_boxes(struct sna *sna, nbox -= nbox_this_time; kgem->nbatch += 3 * nbox_this_time; + assert(kgem->nbatch < kgem->surface); while (nbox_this_time >= 8) { b[0] = cmd; *(uint64_t *)(b+1) = *(const uint64_t *)box++; b[3] = cmd; *(uint64_t *)(b+4) = *(const uint64_t *)box++; @@ -1913,6 +1924,7 @@ static void convert_done(struct sna *sna, const struct sna_composite_op *op) b[0] = XY_SETUP_CLIP; b[1] = b[2] = 0; kgem->nbatch += 3; + assert(kgem->nbatch < kgem->surface); } kgem_bo_destroy(kgem, op->src.bo); @@ -2229,6 +2241,7 @@ static bool sna_blt_fill_box(struct sna *sna, uint8_t alu, 0); b[5] = color; kgem->nbatch += 6; + assert(kgem->nbatch < kgem->surface); sna->blt_state.fill_bo = bo->unique_id; sna->blt_state.fill_pixel = color; @@ -2285,8 +2298,8 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu, } kgem_set_mode(kgem, KGEM_BLT); - if (!kgem_check_bo_fenced(kgem, bo) || - !kgem_check_batch(kgem, 12)) { + if (!kgem_check_batch(kgem, 12) || + !kgem_check_bo_fenced(kgem, bo)) { _kgem_submit(kgem); assert(kgem_check_bo_fenced(&sna->kgem, bo)); _kgem_set_mode(kgem, KGEM_BLT); @@ -2320,6 +2333,7 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu, b[7] = 0; b[8] = 0; kgem->nbatch += 9; + assert(kgem->nbatch < kgem->surface); sna->blt_state.fill_bo = bo->unique_id; sna->blt_state.fill_pixel = pixel; @@ -2350,6 +2364,7 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu, b = kgem->batch + kgem->nbatch; kgem->nbatch += 3; + assert(kgem->nbatch < kgem->surface); b[0] = cmd; *(uint64_t *)(b+1) = *(const uint64_t *)box; box++; @@ -2378,6 +2393,7 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu, b[7] = 0; b[8] = 0; kgem->nbatch += 9; + assert(kgem->nbatch < kgem->surface); } } while (nbox); @@ -2510,6 +2526,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu, KGEM_RELOC_FENCED, 0); kgem->nbatch += 8; + assert(kgem->nbatch < kgem->surface); box++; } while (--nbox_this_time); @@ -2561,6 +2578,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu, KGEM_RELOC_FENCED, 0); kgem->nbatch += 8; + assert(kgem->nbatch < kgem->surface); box++; } while (--nbox_this_time); @@ -2577,6 +2595,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu, b[0] = XY_SETUP_CLIP; b[1] = b[2] = 0; kgem->nbatch += 3; + assert(kgem->nbatch < kgem->surface); } sna->blt_state.fill_bo = 0; diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c index 60ea5171..367bfded 100644 --- a/src/sna/sna_io.c +++ b/src/sna/sna_io.c @@ -379,8 +379,7 @@ fallback: } kgem_set_mode(kgem, KGEM_BLT); - if (kgem->nexec + 2 > KGEM_EXEC_SIZE(kgem) || - kgem->nreloc + 2 > KGEM_RELOC_SIZE(kgem) || + if (!kgem_check_exec_and_reloc(kgem, 2) || !kgem_check_batch(kgem, 8) || !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) { _kgem_submit(kgem); @@ -1173,8 +1172,7 @@ tile: } kgem_set_mode(kgem, KGEM_BLT); - if (kgem->nexec + 2 > KGEM_EXEC_SIZE(kgem) || - kgem->nreloc + 2 > KGEM_RELOC_SIZE(kgem) || + if (!kgem_check_exec_and_reloc(kgem, 2) || !kgem_check_batch(kgem, 8) || !kgem_check_bo_fenced(kgem, dst_bo)) { _kgem_submit(kgem); |