I am having some difficulty booting a FILO (r95) payload using coreboot-v2 (r4291). My target is a via vb7001g, but I'm using the epia-cn target since the boards are practically identical afaict. The only hardware change I've made is using a 2MB flash chip. I was able to boot some simple payloads using coreboot-v2 r4121, too.<br>

<br>So anyway, after doing some tracing using printk's, it seems the problem occurs in build_lb_mem() in arch/i386/boot/coreboot_tables.c when it attempts to record where memory ranges live.<br><br>Added print output in build_lb_mem():<br>

    printk_debug("%s: entered\n", __func__);<br>    /* Record where the lb memory ranges will live */<br>    mem = lb_memory(head);<br>    printk_debug("%s: mem: 0x%p, mem->size = 0x%x\n", __func__, mem, mem->size);<br>

    printk_debug("\tmem->size: 0x%x\n", mem->size);<br>    mem_ranges = mem;<br>    printk_debug("\tmem_ranges->size: 0x%x\n", mem_ranges->size);<br><br>lb_memory() is short, so I'll print the full thing (I only added the two printk's, the rest is unmodified):<br>

struct lb_memory *lb_memory(struct lb_header *header)<br>{<br>    struct lb_record *rec;<br>    struct lb_memory *mem;<br>    printk_debug("%s: entered, header: 0x%p", __func__, header);<br>    rec = lb_new_record(header);<br>

    mem = (struct lb_memory *)rec;<br>    mem->tag = LB_TAG_MEMORY;<br>    mem->size = sizeof(*mem);<br>    printk_debug("%s: exiting, mem: 0x%p, mem->size = 0x%x\n",<br>            __func__, mem, mem->size);<br>

    return mem;<br>}<br><br>...and finally, a snippet from serial output:<br>build_lb_mem: entered, head: 0x3fff0800<br>lb_memory: entered, header: 0x3fff0800<br>lb_memory: exiting, mem: 0x3fff0817, mem->size = 0x8<br>

build_lb_mem: mem: 0x3fff0817, mem->size = 0xffffffff<br>        mem->size: 0xffffffff<br>        mem_ranges->size: 0xffffffff<br><br>So that's pretty weird. But what's also weird is that if I set mem->size manually after it returns from lb_memory() and then set mem_ranges, it somehow gets set back to 0xffffffff. Here's build_lb_mem() with even more printk's added to show that:<br>

    printk_debug("%s: entered, head: 0x%p\n", __func__);<br>    /* Record where the lb memory ranges will live */<br>    mem = lb_memory(head);<br>    printk_debug("%s: mem: 0x%p, mem->size = 0x%x\n", __func__, mem, mem->size);<br>

    mem->size = 8;    /* FIXME: stupid idea */<br>    printk_debug("\tmem->size (after being manually set): 0x%x\n", mem->size);<br>    mem_ranges = mem;<br>    printk_debug("\tmem->size after setting mem_ranges: 0x%x\n", mem->size);<br>

    printk_debug("\tmem_ranges->size: 0x%x\n", mem_ranges->size);<br><br>...and the serial console output:<br>build_lb_mem: entered, head: 0x3fff0800<br>lb_memory: entered, header: 0x3fff0800<br>lb_memory: exiting, mem: 0x3fff0817, mem->size = 0x8<br>

build_lb_mem: mem: 0x3fff0817, mem->size = 0xffffffff<br>        mem->size (after being manually set): 0x8<br>        mem->size after setting mem_ranges: 0xffffffff<br>        mem_ranges->size: 0xffffffff<br>
<br>
Any ideas on what could be happening or where to go next for debugging?<br>