From a8e1cee47d83e7661ccde1ac6f1c656f81784a25 Mon Sep 17 00:00:00 2001 From: felixsmole-hash Date: Mon, 6 Jul 2026 19:44:25 +0200 Subject: [PATCH 1/2] Fix incompatible pointer type in handle_sync_exception MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit arch_context_get_pc() expects cpu_context_t*, but handle_sync_exception() was passing it struct pt_regs* (the exception register frame) — two unrelated structs that happen to both have a pc field. struct pt_regs already stores pc directly, so use regs->pc instead. This was a hard compile error on newer Clang (22.x), blocking ARM64 kernel builds. --- kernel/syscall/syscall.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/kernel/syscall/syscall.c b/kernel/syscall/syscall.c index 9d37b6296..1cb90afa7 100644 --- a/kernel/syscall/syscall.c +++ b/kernel/syscall/syscall.c @@ -762,7 +762,7 @@ void handle_sync_exception(struct pt_regs *regs) { case 0x20: /* Instruction abort from lower EL */ case 0x21: /* Instruction abort from same EL */ printk(KERN_EMERG "Instruction abort at PC=0x%llx\n", - (unsigned long long)arch_context_get_pc(regs)); + (unsigned long long)regs->pc); panic("Instruction abort"); break; @@ -773,13 +773,13 @@ void handle_sync_exception(struct pt_regs *regs) { uint64_t far; asm volatile("mrs %0, far_el1" : "=r"(far)); printk(KERN_EMERG "Data abort at PC=0x%llx, FAR=0x%llx\n", - (unsigned long long)arch_context_get_pc(regs), + (unsigned long long)regs->pc, (unsigned long long)far); #elif defined(ARCH_X86_64) || defined(ARCH_X86) uint64_t cr2; asm volatile("mov %%cr2, %0" : "=r"(cr2)); printk(KERN_EMERG "Page fault at PC=0x%llx, CR2=0x%llx\n", - (unsigned long long)arch_context_get_pc(regs), + (unsigned long long)regs->pc, (unsigned long long)cr2); #endif panic("Data abort"); @@ -787,14 +787,14 @@ void handle_sync_exception(struct pt_regs *regs) { case 0x00: /* Unknown reason */ printk(KERN_EMERG "Unknown exception at PC=0x%llx\n", - (unsigned long long)arch_context_get_pc(regs)); + (unsigned long long)regs->pc); panic("Unknown exception"); break; default: printk(KERN_EMERG "Unhandled exception class 0x%x, ISS=0x%x\n", ec, iss); printk(KERN_EMERG "PC=0x%llx\n", - (unsigned long long)arch_context_get_pc(regs)); + (unsigned long long)regs->pc); panic("Unhandled exception"); break; } From d5c0e217329e2fe729095e5c4f817a016d009372 Mon Sep 17 00:00:00 2001 From: felixsmole-hash Date: Mon, 6 Jul 2026 21:25:03 +0200 Subject: [PATCH 2/2] Add BMP image decoder The desktop and file manager already treated .bmp as an image type (kernel/gui/desktop.c extension match, bootstrap_*_bmp.h extern declarations), but no BMP decoder existed anywhere, so opening a .bmp silently failed. - media_decode_bmp() in kernel/media/media.c: uncompressed 24/32bpp BMPs with BITMAPINFOHEADER or the larger V4/V5 headers, both bottom-up and top-down row order, with bounds validation of the header fields, pixel-data offset, and row stride. - Image Viewer now dispatches on the "BM" magic at all three of its decode sites, the file manager opens .bmp on double-click and tints its icon like other images, and the terminal "view" command accepts .png/.bmp alongside .jpg. - A generated 200x150 24bpp test image is seeded to /Pictures/test.bmp at boot. Verified in QEMU (aarch64 virt + ramfb): double-clicking test.bmp renders it correctly in the Image Viewer - channel order, row order, and dimensions all confirmed against the known test pattern. Co-Authored-By: Claude Fable 5 --- kernel/core/main.c | 6 + kernel/gui/terminal.c | 5 +- kernel/gui/window.c | 15 +- kernel/include/media/media.h | 3 + kernel/media/bootstrap_images/test.bmp | Bin 0 -> 90054 bytes kernel/media/bootstrap_test_bmp.c | 5634 ++++++++++++++++++++++++ kernel/media/media.c | 87 + 7 files changed, 5746 insertions(+), 4 deletions(-) create mode 100644 kernel/media/bootstrap_images/test.bmp create mode 100644 kernel/media/bootstrap_test_bmp.c diff --git a/kernel/core/main.c b/kernel/core/main.c index 2da9c09a8..67c0440aa 100644 --- a/kernel/core/main.c +++ b/kernel/core/main.c @@ -251,6 +251,12 @@ static void init_subsystems(void *dtb) { ramfs_create_file_bytes("Pictures/test.png", 0644, bootstrap_test_png, bootstrap_test_png_len); + /* Add BMP test image to Pictures */ + extern const unsigned char bootstrap_test_bmp[]; + extern const unsigned int bootstrap_test_bmp_len; + ramfs_create_file_bytes("Pictures/test.bmp", 0644, bootstrap_test_bmp, + bootstrap_test_bmp_len); + /* Mount proc, sys, dev (placeholders) */ printk(KERN_INFO " Mounting procfs...\n"); diff --git a/kernel/gui/terminal.c b/kernel/gui/terminal.c index 1de76836e..20dce995d 100644 --- a/kernel/gui/terminal.c +++ b/kernel/gui/terminal.c @@ -667,8 +667,9 @@ void term_execute_command(struct terminal *term, const char *cmd) { return; } - if (!str_ends_with_ci(path, ".jpg") && !str_ends_with_ci(path, ".jpeg")) { - term_puts(term, "view: only .jpg/.jpeg supported\n"); + if (!str_ends_with_ci(path, ".jpg") && !str_ends_with_ci(path, ".jpeg") && + !str_ends_with_ci(path, ".png") && !str_ends_with_ci(path, ".bmp")) { + term_puts(term, "view: only .jpg/.jpeg/.png/.bmp supported\n"); return; } diff --git a/kernel/gui/window.c b/kernel/gui/window.c index 1b11b8144..0039a719d 100644 --- a/kernel/gui/window.c +++ b/kernel/gui/window.c @@ -1047,7 +1047,8 @@ static int fm_render_callback(void *ctx, const char *name, int len, bmp = icon_notepad; color = 0xFFFFFF; } else if (str_ends_with_ci(name, ".jpg") || - str_ends_with_ci(name, ".jpeg")) { + str_ends_with_ci(name, ".jpeg") || + str_ends_with_ci(name, ".bmp")) { color = 0xF9E2AF; } else if (str_ends_with_ci(name, ".mp3")) { color = 0xA6E3A1; @@ -1280,7 +1281,8 @@ static void fm_on_mouse(struct window *win, int x, int y, int buttons) { gui_open_notepad(full_path); } else if (str_ends_with_ci(st->selected, ".jpg") || str_ends_with_ci(st->selected, ".jpeg") || - str_ends_with_ci(st->selected, ".png")) { + str_ends_with_ci(st->selected, ".png") || + str_ends_with_ci(st->selected, ".bmp")) { gui_open_image_viewer(full_path); } else if (str_ends_with_ci(st->selected, ".mp3")) { gui_play_mp3_file(full_path); @@ -1423,6 +1425,11 @@ void gui_open_image_viewer(const char *path) { if (decode_ret != 0) { printk("Image Viewer: PNG decode failed\n"); } + } else if (size >= 2 && data[0] == 'B' && data[1] == 'M') { + decode_ret = media_decode_bmp(data, size, &g_imgview.image); + if (decode_ret != 0) { + printk("Image Viewer: BMP decode failed\n"); + } } else { /* Assume JPEG */ decode_ret = media_decode_jpeg(data, size, &g_imgview.image); @@ -4413,6 +4420,8 @@ static void image_viewer_load_bootstrap(int index) { if (len >= 4 && data[0] == 0x89 && data[1] == 'P' && data[2] == 'N' && data[3] == 'G') { ret = media_decode_png(data, len, &g_imgview.image); + } else if (len >= 2 && data[0] == 'B' && data[1] == 'M') { + ret = media_decode_bmp(data, len, &g_imgview.image); } else { ret = media_decode_jpeg(data, len, &g_imgview.image); } @@ -4475,6 +4484,8 @@ static void image_viewer_load_from_folder(int index) { if (size >= 4 && data[0] == 0x89 && data[1] == 'P' && data[2] == 'N' && data[3] == 'G') { ret = media_decode_png(data, size, &g_imgview.image); + } else if (size >= 2 && data[0] == 'B' && data[1] == 'M') { + ret = media_decode_bmp(data, size, &g_imgview.image); } else { ret = media_decode_jpeg(data, size, &g_imgview.image); } diff --git a/kernel/include/media/media.h b/kernel/include/media/media.h index 0026201f5..d5d694146 100644 --- a/kernel/include/media/media.h +++ b/kernel/include/media/media.h @@ -30,4 +30,7 @@ void media_free_audio(media_audio_t *audio); int media_decode_png(const uint8_t *data, size_t size, media_image_t *out); +/* Uncompressed 24/32bpp BMP (BITMAPINFOHEADER and V4/V5 variants) */ +int media_decode_bmp(const uint8_t *data, size_t size, media_image_t *out); + #endif /* _KERNEL_MEDIA_H */ diff --git a/kernel/media/bootstrap_images/test.bmp b/kernel/media/bootstrap_images/test.bmp new file mode 100644 index 0000000000000000000000000000000000000000..05476a04ef94d639c986916b931ed8600c779fbc GIT binary patch literal 90054 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

T2vEAdw0eT4Th-fFxxcx&<2;eCSlDc*X#&+sFo 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 = pixels; return 0; } + +/* --------------------------------------------------------------------- */ +/* BMP decoding (uncompressed 24/32bpp) */ +/* --------------------------------------------------------------------- */ + +static uint32_t bmp_read_le32(const uint8_t *p) { + return (uint32_t)p[0] | ((uint32_t)p[1] << 8) | ((uint32_t)p[2] << 16) | + ((uint32_t)p[3] << 24); +} + +static uint16_t bmp_read_le16(const uint8_t *p) { + return (uint16_t)((uint32_t)p[0] | ((uint32_t)p[1] << 8)); +} + +int media_decode_bmp(const uint8_t *data, size_t size, media_image_t *out) { + if (!data || !out || size < 54 || data[0] != 'B' || data[1] != 'M') + return -EINVAL; + + uint32_t pixel_offset = bmp_read_le32(data + 10); + uint32_t dib_size = bmp_read_le32(data + 14); + + /* BITMAPINFOHEADER (40) or the larger V4/V5 headers that extend it */ + if (dib_size < 40 || (size_t)14 + dib_size > size) { + printk(KERN_ERR "BMP: unsupported DIB header (%u bytes)\n", dib_size); + return -EINVAL; + } + + int32_t width = (int32_t)bmp_read_le32(data + 18); + int32_t height = (int32_t)bmp_read_le32(data + 22); + uint16_t planes = bmp_read_le16(data + 26); + uint16_t bpp = bmp_read_le16(data + 28); + uint32_t compression = bmp_read_le32(data + 30); + + int top_down = 0; + if (height < 0) { + top_down = 1; + height = -height; + } + + /* BI_RGB only; BI_BITFIELDS (3) is accepted for 32bpp since the + * standard BGRA masks match our channel extraction anyway */ + if (planes != 1 || (bpp != 24 && bpp != 32) || + (compression != 0 && !(compression == 3 && bpp == 32))) { + printk(KERN_ERR "BMP: unsupported format (%u bpp, compression %u)\n", bpp, + compression); + return -EINVAL; + } + + if (width <= 0 || height <= 0 || + (size_t)width > SIZE_MAX / (size_t)height) { + printk(KERN_ERR "BMP: bad dimensions\n"); + return -EINVAL; + } + + size_t pixel_count = (size_t)width * (size_t)height; + if (pixel_count > 16 * 1024 * 1024) { + printk(KERN_ERR "BMP: image too large (%zu pixels)\n", pixel_count); + return -EINVAL; + } + + size_t bytes_per_px = bpp / 8; + size_t stride = ((size_t)width * bytes_per_px + 3) & ~(size_t)3; + if (pixel_offset > size || stride > (size - pixel_offset) / (size_t)height) { + printk(KERN_ERR "BMP: pixel data out of bounds\n"); + return -EINVAL; + } + + uint32_t *pixels = + (uint32_t *)kmalloc(pixel_count * sizeof(uint32_t), GFP_KERNEL); + if (!pixels) + return -ENOMEM; + + for (int32_t y = 0; y < height; y++) { + int32_t src_y = top_down ? y : height - 1 - y; + const uint8_t *row = data + pixel_offset + (size_t)src_y * stride; + for (int32_t x = 0; x < width; x++) { + const uint8_t *px = row + (size_t)x * bytes_per_px; + pixels[(size_t)y * width + x] = + ((uint32_t)px[2] << 16) | ((uint32_t)px[1] << 8) | px[0]; + } + } + + out->width = (uint32_t)width; + out->height = (uint32_t)height; + out->pixels = pixels; + return 0; +}