From 7248957553e4ac38cfb672089b8cc88a86294b32 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Tue, 11 Jan 2022 14:02:14 +0100 Subject: [PATCH] rpi_fb_drv: avoid alignment fault by own blit func Fix #4331 --- repos/os/src/drivers/framebuffer/rpi/main.cc | 28 ++++++++++++++++--- .../os/src/drivers/framebuffer/rpi/target.mk | 2 +- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/repos/os/src/drivers/framebuffer/rpi/main.cc b/repos/os/src/drivers/framebuffer/rpi/main.cc index f234a9ef51..901846a405 100644 --- a/repos/os/src/drivers/framebuffer/rpi/main.cc +++ b/repos/os/src/drivers/framebuffer/rpi/main.cc @@ -22,10 +22,30 @@ #include #include -namespace Framebuffer { - using namespace Genode; - struct Main; -}; +namespace Framebuffer { struct Main; }; + +using namespace Genode; + + +/** + * The blit library is not free of potential mis-aligned pointer access, + * which is not a problem with normal memory. But the Rpi framebuffer driver + * uses ordered I/O memory as backend, where mis-aligned memory access is a problem. + * Therefore, we do not use the blit library here, but implement a simple + * blit function ourselves. + */ +extern "C" void blit(void const * s, unsigned src_w, + void * d, unsigned dst_w, int w, int h) +{ + char const *src = (char const *)s; + char *dst = (char *)d; + + if (w <= 0 || h <= 0) return; + + for (; h--; src += (src_w-w), dst += (dst_w-w)) + for (int i = (w >> 2); i--; src += 4, dst += 4) + *(uint32_t *)dst = *(uint32_t const *)src; +} struct Framebuffer::Main diff --git a/repos/os/src/drivers/framebuffer/rpi/target.mk b/repos/os/src/drivers/framebuffer/rpi/target.mk index d087274b60..e7732c3249 100644 --- a/repos/os/src/drivers/framebuffer/rpi/target.mk +++ b/repos/os/src/drivers/framebuffer/rpi/target.mk @@ -1,6 +1,6 @@ TARGET = rpi_fb_drv REQUIRES = arm_v6 SRC_CC = main.cc -LIBS = base blit +LIBS = base INC_DIR += $(PRG_DIR) INC_DIR += $(call select_from_repositories,include/spec/rpi)