int boot_linux_from_flash(void) { boot_img_hdr *hdr = (void*) raw_header; unsigned n; ptentry *p; unsigned offset = 0; const char *cmdline; if((p = flash_find_ptn("boot")) == 0) { cprintf("NO BOOT PARTITION\n"); return -1; } if(flash_read(p, offset, raw_header, 2048)) { cprintf("CANNOT READ BOOT IMAGE HEADER\n"); return -1; } offset += 2048; if(memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) { cprintf("INVALID BOOT IMAGE HEADER\n"); return -1; } n = (hdr->kernel_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1)); if(flash_read(p, offset, (void*) hdr->kernel_addr, n)) { cprintf("CANNOT READ KERNEL IMAGE\n"); return -1; } offset += n; n = (hdr->ramdisk_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1)); if(flash_read(p, offset, (void*) hdr->ramdisk_addr, n)) { cprintf("CANNOT READ RAMDISK IMAGE\n"); return -1; } offset += n; dprintf("\nkernel @ %x (%d bytes)\n", hdr->kernel_addr, hdr->kernel_size); dprintf("ramdisk @ %x (%d bytes)\n\n\n", hdr->ramdisk_addr, hdr->ramdisk_size); if(hdr->cmdline[0]) { cmdline = (char*) hdr->cmdline; } else { cmdline = board_cmdline(); if(cmdline == 0) { cmdline = "mem=50M console=null"; } } cprintf("cmdline = '%s'\n", cmdline); cprintf("\nBooting Linux\n"); create_atags(ADDR_TAGS, cmdline, hdr->ramdisk_addr, hdr->ramdisk_size); boot_linux(hdr->kernel_addr); return 0; }
static void boot_linux(void) { unsigned *tags = (unsigned*) TAGS_ADDR; int ret; int (*entry)(unsigned,unsigned,unsigned) = (void*) kernel_addr; if(linux_type == 0) { linux_type = board_machtype(); } if(!cmdline[0]){ strcpy(cmdline, board_cmdline()); } fixup_tags((unsigned*) linux_tags, tags, cmdline); DISPLAY_MSG("entry=%x, entry(%d, %d, %x)\n", entry, 0, linux_type, tags); ret = entry(0, linux_type, tags); mmu_off(); DISPLAY_MSG("ok ret=%x\n", ret); //goroh for re-entry boot-img loading // for(;;); }