Sorry, that my question about memory lead to confusion. I just asked, to get a bit of an overview, what address range to expect. (e.g. address 0xa800000033xxxxxx is between 304 and 320MB, the size of the secondary cache is also interesting, since it determines, which bits from the physical address make an index into the cache) All this highmem stuff only concerns 32bit kernels, which we cannot use on IP28 anyway (one reason is, that here RAM starts at address 512MB). You should be able to put in up to 1GiB of RAM without problems. In the attachements you can see, what i could find out about both Oops'es. (Fortunately the older kernel and System.map matched the latter ones over a wide range) About looking up interesting addresses in System.map: ksymoops often gives us a reference for the trapped instruction relative only to a local label, e.g. >>PC; a8000000201b51a0 <$L142+8/18> <===== since $L142 is a local label (mostly there are several of the same name in System.map) we look up the function with the next lower address, here we find a8000000201b5100 T vsnprintf ... a8000000201b5198 t $L142 >> >>PC; a8000000201b51a0 == $L142+8 == vsnprintf+0xa0 ... a8000000201b57a0 t $L264 a8000000201b57e8 T snprintf (of course the trapped address itself usually is not in System.map, and a 32bit bus error address must be converted to a kernel address first) Also attached is a more verbose version of ip22-berr.c for the next bus error. with kind regards pf This case is strange, the facts don't fit together very well, the offending address is not related to the trapped instruction. Tracing back, up to do_pipe(), we have the following situation: int do_pipe(int *fd) { /* $29, sp : a800000030317de0 */ struct qstr this; /* &this = &.name = sp, &.len = sp+8, &.hash = sp+12 */ char name[32]; /* &name = sp+16 */ struct dentry *dentry; struct inode * inode; struct file *f1, *f2; int error; int i,j; ... error = -ENOMEM; sprintf(name, "[%lu]", inode->i_ino); this.name = name; this.len = strlen(name); this.hash = inode->i_ino; /* will go */ dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &this); ... } struct dentry * d_alloc(struct dentry * parent, const struct qstr *name) { /* $29, sp : a800000030317db0 */ char * str; struct dentry *dentry; dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL); if (!dentry) return NULL; if (name->len > DNAME_INLINE_LEN-1) { str = kmalloc(NAME_ALLOC_LEN(name->len), GFP_KERNEL); if (!str) { kmem_cache_free(dentry_cache, dentry); return NULL; } } else str = dentry->d_iname; memcpy(str, name->name, name->len); ... } This efectively results in a call: memcpy(dentry->d_iname, name->name, name->len); with numerical addresses: memcpy( a80000002e02cea8, a800000030317df0, 8 ); vmlinux: file format elf64-tradbigmips Disassembly of section .text: a8000000201b34c0 : a8000000201b34c0: 0080102d move v0,a0 a8000000201b34c4 <__copy_user>: ... a8000000201b35ac : a8000000201b35ac: 13060040 beq t8,a2,a8000000201b36b0 a8000000201b35b0: 00000000 nop a8000000201b35b4: dca80000 ld a4,0(a1) a8000000201b35b8: 64a50008 daddiu a1,a1,8 a8000000201b35bc: 64c6fff8 daddiu a2,a2,-8 a8000000201b35c0 : a8000000201b35c0: fc880000 sd a4,0(a0) ... a8000000201b3720 : a8000000201b3720: 03e00008 jr ra a8000000201b3724: 00000000 nop GIO error 0x410: