summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-10-07 22:41:02 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-10-07 22:41:02 +0100
commit1a5d5b9ae5771d81da16222582acedb1557386c8 (patch)
treec018bb3a9dcbbbff32abc6461c81bcd0982f5c93 /src
parentb41ecda69f2e6c9f8adf79dd24ded45740bcc015 (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.h5
-rw-r--r--src/sna/sna_blt.c31
-rw-r--r--src/sna/sna_io.c6
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);