OK, well let's start small. One source of problems is that we have drivers/gpu/drm/nouveau/nouveau_bios.h:#define ROM16(x) le16_to_cpu(*(u16 *)&(x)) Which can only work on aligned pointers x, but it gets called with unaligned offsets in nouveau_bios.c Can you try changing that to #define ROM16(x) get_unaligned_le16(&(x)) I'm guessing that will help with the first group of unaligned traps.