{
struct cb_header *header;
unsigned char *ptr = addr;
+ void *forward;
int i;
for (i = 0; i < len; i += 16, ptr += 16) {
header->table_bytes) != header->table_checksum)
return -1;
+ info->header = header;
+
/* Now, walk the tables. */
ptr += header->header_bytes;
/* We only care about a few tags here (maybe more later). */
switch (rec->tag) {
case CB_TAG_FORWARD:
- return cb_parse_header((void *)(unsigned long)((struct cb_forward *)rec)->forward, len, info);
+ forward = phys_to_virt((void *)(unsigned long)((struct cb_forward *)rec)->forward);
+ return cb_parse_header(forward, len, info);
continue;
case CB_TAG_MEMORY:
cb_parse_memory(ptr, info);
cb_parse_framebuffer(ptr, info);
break;
#endif
+ case CB_TAG_MAINBOARD:
+ info->mainboard = (struct cb_mainboard *)ptr;
+ break;
}
ptr += rec->size;