Fill out ChromeOS specific coreboot table extensions
[coreboot.git] / src / boot / selfboot.c
index 573dd5ee5a3f745d4bc269e2e4c325439e2f7e94..3c310234cb48ff312dab512892b49630d6acfff7 100644 (file)
 #include <boot/elf.h>
 #include <boot/elf_boot.h>
 #include <boot/coreboot_tables.h>
-#include <ip_checksum.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
 #include <cbfs.h>
 #include <lib.h>
+#if CONFIG_COLLECT_TIMESTAMPS
+#include <timestamp.h>
+#endif
 
 /* Maximum physical address we can use for the coreboot bounce buffer. */
 #ifndef MAX_ADDR
@@ -46,8 +48,6 @@ static const unsigned long lb_end = (unsigned long)&_eram_seg;
 struct segment {
        struct segment *next;
        struct segment *prev;
-       struct segment *phdr_next;
-       struct segment *phdr_prev;
        unsigned long s_dstaddr;
        unsigned long s_srcaddr;
        unsigned long s_memsz;
@@ -140,15 +140,20 @@ static int valid_area(struct lb_memory *mem, unsigned long buffer,
                mtype = mem->map[i].type;
                mstart = unpack_lb64(mem->map[i].start);
                mend = mstart + unpack_lb64(mem->map[i].size);
-               if ((mtype == LB_MEM_RAM) && (start < mend) && (end > mstart)) {
+               if ((mtype == LB_MEM_RAM) && (start >= mstart) && (end < mend)) {
                        break;
                }
-               if ((mtype == LB_MEM_TABLE) && (start < mend) && (end > mstart)) {
+               if ((mtype == LB_MEM_TABLE) && (start >= mstart) && (end < mend)) {
                        printk(BIOS_ERR, "Payload is overwriting coreboot tables.\n");
                        break;
                }
        }
        if (i == mem_entries) {
+               if (start < (1024*1024) && end <=(1024*1024)) {
+                       printk(BIOS_DEBUG, "Payload (probably SeaBIOS) loaded"
+                               " into a reserved area in the lower 1MB\n");
+                       return 1;
+               }
                printk(BIOS_ERR, "No matching ram area found for range:\n");
                printk(BIOS_ERR, "  [0x%016lx, 0x%016lx)\n", start, end);
                printk(BIOS_ERR, "Ram areas\n");
@@ -227,11 +232,6 @@ static int relocate_segment(unsigned long buffer, struct segment *seg)
                        new->prev = seg->prev;
                        seg->prev->next = new;
                        seg->prev = new;
-                       /* Order by original program header order */
-                       new->phdr_next = seg;
-                       new->phdr_prev = seg->phdr_prev;
-                       seg->phdr_prev->phdr_next = new;
-                       seg->phdr_prev = new;
 
                        /* compute the new value of start */
                        start = seg->s_dstaddr;
@@ -267,11 +267,6 @@ static int relocate_segment(unsigned long buffer, struct segment *seg)
                        new->prev = seg;
                        seg->next->prev = new;
                        seg->next = new;
-                       /* Order by original program header order */
-                       new->phdr_next = seg->phdr_next;
-                       new->phdr_prev = seg;
-                       seg->phdr_next->phdr_prev = new;
-                       seg->phdr_next = new;
 
                        printk(BIOS_SPEW, "   late: [0x%016lx, 0x%016lx, 0x%016lx)\n",
                                new->s_dstaddr,
@@ -305,7 +300,6 @@ static int build_self_segment_list(
        struct segment *ptr;
        struct cbfs_payload_segment *segment, *first_segment;
        memset(head, 0, sizeof(*head));
-       head->phdr_next = head->phdr_prev = head;
        head->next = head->prev = head;
        first_segment = segment = &payload->segments;
 
@@ -368,9 +362,10 @@ static int build_self_segment_list(
                        return -1;
                }
 
+               /* We have found another CODE, DATA or BSS segment */
                segment++;
 
-               // FIXME: Explain what this is
+               /* Find place where to insert our segment */
                for(ptr = head->next; ptr != head; ptr = ptr->next) {
                        if (new->s_srcaddr < ntohll(segment->load_addr))
                                break;
@@ -381,12 +376,6 @@ static int build_self_segment_list(
                new->prev = ptr->prev;
                ptr->prev->next = new;
                ptr->prev = new;
-
-               /* Order by original program header order */
-               new->phdr_next = head;
-               new->phdr_prev = head->phdr_prev;
-               head->phdr_prev->phdr_next  = new;
-               head->phdr_prev = new;
        }
 
        return 1;
@@ -401,7 +390,8 @@ static int load_self_segments(
 
        unsigned long bounce_high = lb_end;
        for(ptr = head->next; ptr != head; ptr = ptr->next) {
-               if (!overlaps_coreboot(ptr)) continue;
+               if (!overlaps_coreboot(ptr))
+                       continue;
                if (ptr->s_dstaddr + ptr->s_memsz > bounce_high)
                        bounce_high = ptr->s_dstaddr + ptr->s_memsz;
        }
@@ -525,11 +515,15 @@ static int selfboot(struct lb_memory *mem, struct cbfs_payload *payload)
        printk(BIOS_DEBUG, "Jumping to boot code at %x\n", entry);
        post_code(POST_ENTER_ELF_BOOT);
 
+#if CONFIG_COLLECT_TIMESTAMPS
+       timestamp_add_now(TS_SELFBOOT_JUMP);
+#endif
+
        /* Jump to kernel */
        jmp_to_elf_entry((void*)entry, bounce_buffer, bounce_size);
        return 1;
 
- out:
+out:
        return 0;
 }