core, fix rendering copy buffer overlap reported from asan

This commit is contained in:
kub 2021-10-16 10:05:04 +02:00
parent 2dacba5235
commit d2e3f475ff
2 changed files with 40 additions and 3 deletions

View file

@ -132,8 +132,12 @@ void blockcpy_or(void *dst, void *src, size_t n, int pat);
void blockcpy_or(void *dst, void *src, size_t n, int pat) void blockcpy_or(void *dst, void *src, size_t n, int pat)
{ {
unsigned char *pd = dst, *ps = src; unsigned char *pd = dst, *ps = src;
for (; n; n--) if (dst > src) {
*pd++ = (unsigned char) (*ps++ | pat); for (pd += n, ps += n; n; n--)
*--pd = (unsigned char) (*--ps | pat);
} else
for (; n; n--)
*pd++ = (unsigned char) (*ps++ | pat);
} }
#define blockcpy memmove #define blockcpy memmove
#endif #endif
@ -2019,7 +2023,6 @@ void PicoDrawSetOutFormat(pdso_t which, int use_32x_line_mode)
{ {
case PDF_8BIT: case PDF_8BIT:
FinalizeLine = FinalizeLine8bit; FinalizeLine = FinalizeLine8bit;
PicoDrawSetInternalBuf(Pico.est.Draw2FB, 328);
break; break;
case PDF_RGB555: case PDF_RGB555:

View file

@ -2205,6 +2205,9 @@ FinalizeLine555:
blockcpy: blockcpy:
stmfd sp!, {r4,r5} stmfd sp!, {r4,r5}
cmp r0, r1
bhs blockcpyhi
mov r2, r2, lsr #4 mov r2, r2, lsr #4
blockcpy_loop: blockcpy_loop:
ldmia r1!, {r3-r5,r12} ldmia r1!, {r3-r5,r12}
@ -2214,6 +2217,18 @@ blockcpy_loop:
ldmfd sp!, {r4,r5} ldmfd sp!, {r4,r5}
bx lr bx lr
blockcpyhi:
add r0, r0, r2
add r1, r1, r2
mov r2, r2, lsr #4
blockcpyhi_loop:
ldmdb r1!, {r3-r5,r12}
subs r2, r2, #1
stmdb r0!, {r3-r5,r12}
bne blockcpyhi_loop
ldmfd sp!, {r4,r5}
bx lr
.global blockcpy_or @ void *dst, void *src, size_t n, int pat .global blockcpy_or @ void *dst, void *src, size_t n, int pat
@ -2221,6 +2236,9 @@ blockcpy_or:
stmfd sp!, {r4-r6} stmfd sp!, {r4-r6}
orr r3, r3, r3, lsl #8 orr r3, r3, r3, lsl #8
orr r3, r3, r3, lsl #16 orr r3, r3, r3, lsl #16
cmp r0, r1
bhs blockcpyhi_or
mov r2, r2, lsr #4 mov r2, r2, lsr #4
blockcpy_loop_or: blockcpy_loop_or:
ldmia r1!, {r4-r6,r12} ldmia r1!, {r4-r6,r12}
@ -2234,4 +2252,20 @@ blockcpy_loop_or:
ldmfd sp!, {r4-r6} ldmfd sp!, {r4-r6}
bx lr bx lr
blockcpyhi_or:
add r0, r0, r2
add r1, r1, r2
mov r2, r2, lsr #4
blockcpyhi_loop_or:
ldmdb r1!, {r4-r6,r12}
subs r2, r2, #1
orr r4, r4, r3
orr r5, r5, r3
orr r6, r6, r3
orr r12,r12,r3
stmdb r0!, {r4-r6,r12}
bne blockcpyhi_loop_or
ldmfd sp!, {r4-r6}
bx lr
@ vim:filetype=armasm @ vim:filetype=armasm