static void setup_mem_atag(unsigned int start, size_t len) { params->hdr.tag = ATAG_MEM; /* Memory tag */ params->hdr.size = atag_size(atag_mem); /* size tag */ params->u.mem.start = start; /* Start of memory area (physical address) */ params->u.mem.size = len; /* Length of area */ params = atag_next(params); /* move pointer to next tag */ }
static void setup_initrd2_atag(unsigned int start, size_t size) { params->hdr.tag = ATAG_INITRD2; /* Initrd2 tag */ params->hdr.size = atag_size(atag_initrd2); /* size tag */ params->u.initrd2.start = start; /* physical start */ params->u.initrd2.size = size; /* compressed ramdisk size */ params = atag_next(params); /* move pointer to next tag */ }
static void setup_ramdisk_atag(size_t size) { params->hdr.tag = ATAG_RAMDISK; /* Ramdisk tag */ params->hdr.size = atag_size(atag_ramdisk); /* size tag */ params->u.ramdisk.flags = 0; /* Load the ramdisk */ params->u.ramdisk.size = size; /* Decompressed ramdisk size */ params->u.ramdisk.start = 0; /* Unused */ params = atag_next(params); /* move pointer to next tag */ }
static void setup_core_atag(void * address, long pagesize) { params = (struct atag *)address; /* Initialise parameters to start at given address */ params->hdr.tag = ATAG_CORE; /* start with the core tag */ params->hdr.size = atag_size(atag_core); /* size the tag */ params->u.core.flags = 1; /* ensure read-only */ params->u.core.pagesize = pagesize; /* systems pagesize (4k) */ params->u.core.rootdev = 0; /* zero root device (typicaly overidden from commandline )*/ params = atag_next(params); /* move pointer to next tag */ }
static void setup_cmdline_atag(const char * line) { int linelen = strlen(line); if(!linelen) return; /* do not insert a tag for an empty commandline */ params->hdr.tag = ATAG_CMDLINE; /* Commandline tag */ params->hdr.size = (sizeof(struct atag_header) + linelen + 1 + 4) >> 2; strcpy(params->u.cmdline.cmdline,line); /* place commandline into tag */ params = atag_next(params); /* move pointer to next tag */ }
int main(void (*sr_read)(unsigned int start_sector, char *buffer, int num_sectors), void (*ser_puts)(const char *buffer)) { char *dst = (char *)LINUX_LOADADDR; const struct mbr_part *part; unsigned found = 0; unsigned int i; BUILD_BUG_ON(sizeof(struct mbr_part) != 16); BUILD_BUG_ON(sizeof(struct mbr) != SECT_SIZE); if (mbr->sig != MBR_SIG) { ser_puts("S"); die(); } for (i = 0; i < NUM_PE; i++) { part = &mbr->pe[i]; /* First partition is Linux */ if (part->type != PART_TYPE_OTHER_DATA) { ser_puts("P"); continue; } ser_puts("L"); sr_read(part->lba, dst, part->num_sects); ser_puts(".\r\n"); found = 1; break; } if (!found) { dbg_str("N"); die(); } /* Prepare ATAGS */ atags->hdr.tag = ATAG_CORE; atags->hdr.size = atag_size(atag_core); atags->u.core.flags = 1; atags->u.core.pagesize = 4096; atags->u.core.rootdev = 0; atags = atag_next(atags); #if (SDRAM_SIZE_MB > 32) #error "Need to add additional ATAG_MEM for second bank!" #endif atags->hdr.tag = ATAG_MEM; atags->hdr.size = atag_size(atag_mem); atags->u.mem.start = 0; atags->u.mem.size = 8 << 20; atags = atag_next(atags); atags->hdr.tag = ATAG_MEM; atags->hdr.size = atag_size(atag_mem); atags->u.mem.start = 0x1000000; atags->u.mem.size = 8 << 20; atags = atag_next(atags); atags->hdr.tag = ATAG_MEM; atags->hdr.size = atag_size(atag_mem); atags->u.mem.start = 0x4000000; atags->u.mem.size = 8 << 20; atags = atag_next(atags); atags->hdr.tag = ATAG_MEM; atags->hdr.size = atag_size(atag_mem); atags->u.mem.start = 0x5000000; atags->u.mem.size = 8 << 20; atags = atag_next(atags); atags->hdr.tag = ATAG_NONE; atags->hdr.size = 0; /* Start kernel, bye! */ ser_puts("G\r\n"); void (*kernel_start)(int, int, uint32_t) = (void *)LINUX_LOADADDR; kernel_start(0, TS72XX_MACH_NUM, ATAGS_OFFSET); return 0; }