core, fix rendering copy buffer overlap reported from asan
authorkub <derkub@gmail.com>
Sat, 16 Oct 2021 08:05:04 +0000 (10:05 +0200)
committerkub <derkub@gmail.com>
Sat, 16 Oct 2021 08:05:04 +0000 (10:05 +0200)
pico/draw.c
pico/draw_arm.S

index 2b34922..236e347 100644 (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)\r
 {\r
   unsigned char *pd = dst, *ps = src;\r
-  for (; n; n--)\r
-    *pd++ = (unsigned char) (*ps++ | pat);\r
+  if (dst > src) {\r
+    for (pd += n, ps += n; n; n--)\r
+      *--pd = (unsigned char) (*--ps | pat);\r
+  } else\r
+    for (; n; n--)\r
+      *pd++ = (unsigned char) (*ps++ | pat);\r
 }\r
 #define blockcpy memmove\r
 #endif\r
@@ -2019,7 +2023,6 @@ void PicoDrawSetOutFormat(pdso_t which, int use_32x_line_mode)
   {\r
     case PDF_8BIT:\r
       FinalizeLine = FinalizeLine8bit;\r
-      PicoDrawSetInternalBuf(Pico.est.Draw2FB, 328);\r
       break;\r
 \r
     case PDF_RGB555:\r
index 6a3641b..a991563 100644 (file)
@@ -2205,6 +2205,9 @@ FinalizeLine555:
 \r
 blockcpy:\r
     stmfd   sp!, {r4,r5}\r
+    cmp     r0, r1\r
+    bhs     blockcpyhi\r
+\r
     mov     r2, r2, lsr #4\r
 blockcpy_loop:\r
     ldmia   r1!, {r3-r5,r12}\r
@@ -2214,6 +2217,18 @@ blockcpy_loop:
     ldmfd   sp!, {r4,r5}\r
     bx      lr\r
 \r
+blockcpyhi:\r
+    add     r0, r0, r2\r
+    add     r1, r1, r2\r
+    mov     r2, r2, lsr #4\r
+blockcpyhi_loop:\r
+    ldmdb   r1!, {r3-r5,r12}\r
+    subs    r2, r2, #1\r
+    stmdb   r0!, {r3-r5,r12}\r
+    bne     blockcpyhi_loop\r
+    ldmfd   sp!, {r4,r5}\r
+    bx      lr\r
+\r
 \r
 .global blockcpy_or @ void *dst, void *src, size_t n, int pat\r
 \r
@@ -2221,6 +2236,9 @@ blockcpy_or:
     stmfd   sp!, {r4-r6}\r
     orr     r3, r3, r3, lsl #8\r
     orr     r3, r3, r3, lsl #16\r
+    cmp     r0, r1\r
+    bhs     blockcpyhi_or\r
+\r
     mov     r2, r2, lsr #4\r
 blockcpy_loop_or:\r
     ldmia   r1!, {r4-r6,r12}\r
@@ -2234,4 +2252,20 @@ blockcpy_loop_or:
     ldmfd   sp!, {r4-r6}\r
     bx      lr\r
 \r
+blockcpyhi_or:\r
+    add     r0, r0, r2\r
+    add     r1, r1, r2\r
+    mov     r2, r2, lsr #4\r
+blockcpyhi_loop_or:\r
+    ldmdb   r1!, {r4-r6,r12}\r
+    subs    r2, r2, #1\r
+    orr     r4, r4, r3\r
+    orr     r5, r5, r3\r
+    orr     r6, r6, r3\r
+    orr     r12,r12,r3\r
+    stmdb   r0!, {r4-r6,r12}\r
+    bne     blockcpyhi_loop_or\r
+    ldmfd   sp!, {r4-r6}\r
+    bx      lr\r
+\r
 @ vim:filetype=armasm\r