X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=second%2Fyaboot.c;h=53643f5c5fff48d56f809712a535e67f2d429810;hb=f3d8af0e0ac4642499d5430c202ac57d1d4c5ceb;hp=6eef8d69ccc94a170694106f0dcbe70b40421b8f;hpb=fa024941f8f1237e01e2ecf338442be9062953cc;p=tonyb-yaboot.git diff --git a/second/yaboot.c b/second/yaboot.c index 6eef8d6..53643f5 100644 --- a/second/yaboot.c +++ b/second/yaboot.c @@ -455,7 +455,9 @@ static int load_my_config_file(struct boot_fspec_t *orig_fspec) struct bootp_packet *packet; int rc = 0; struct boot_fspec_t fspec = *orig_fspec; -#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) + char *cfgpath = (_machine == _MACH_chrp) ? "/etc/" : ""; + int flen; + int minlen; packet = prom_get_netinfo(); @@ -469,34 +471,26 @@ static int load_my_config_file(struct boot_fspec_t *orig_fspec) if (!fspec.file) goto out; - if (_machine == _MACH_chrp) - sprintf(fspec.file, "/etc/%02x-", packet->htype); - else - sprintf(fspec.file, "%02x-", packet->htype); + sprintf(fspec.file, "%s%02x-", cfgpath, packet->htype); strcat(fspec.file, prom_get_mac(packet)); rc = load_config_file(&fspec); if (rc) goto out; - /* * Now try to match on IP. */ - free(fspec.file); - /* 8 chars in yiaddr + \0 */ - fspec.file = malloc(9); - if (!fspec.file) - goto out; - - strcat(fspec.file, prom_get_ip(packet)); + /* no need to realloc for /etc/ + 8 chars in yiaddr + \0 */ + sprintf(fspec.file, "%s%s", cfgpath, prom_get_ip(packet)); - while (strlen(fspec.file)) { + for (flen = strlen(fspec.file), + minlen = strlen(cfgpath); flen > minlen; flen--) { rc = load_config_file(&fspec); if (rc) goto out; /* Chop one digit off the end, try again */ - fspec.file[strlen(fspec.file) - 1] = '\0'; + fspec.file[flen - 1] = '\0'; } out: @@ -1239,7 +1233,7 @@ load_elf32(struct boot_file_t *file, loadinfo_t *loadinfo) Elf32_Ehdr *e = &(loadinfo->elf.elf32hdr); Elf32_Phdr *p, *ph; int size = sizeof(Elf32_Ehdr) - sizeof(Elf_Ident); - unsigned long addr, loadaddr; + unsigned long loadaddr; /* Read the rest of the Elf header... */ if ((*(file->fs->read))(file, size, &e->e_version) < size) { @@ -1327,13 +1321,7 @@ load_elf32(struct boot_file_t *file, loadinfo_t *loadinfo) loadaddr = loadinfo->load_loc; } - /* On some systems, loadaddr may already be claimed, so try some - * other nearby addresses before giving up. - */ - for(addr=loadaddr; addr <= loadaddr * 8 ;addr+=0x100000) { - loadinfo->base = prom_claim((void *)addr, loadinfo->memsize, 0); - if (loadinfo->base != (void *)-1) break; - } + loadinfo->base = prom_claim_chunk((void *)loadaddr, loadinfo->memsize, 0); if (loadinfo->base == (void *)-1) { prom_printf("Claim error, can't allocate kernel memory\n"); goto bail; @@ -1383,7 +1371,7 @@ load_elf64(struct boot_file_t *file, loadinfo_t *loadinfo) Elf64_Ehdr *e = &(loadinfo->elf.elf64hdr); Elf64_Phdr *p, *ph; int size = sizeof(Elf64_Ehdr) - sizeof(Elf_Ident); - unsigned long addr, loadaddr; + unsigned long loadaddr; /* Read the rest of the Elf header... */ if ((*(file->fs->read))(file, size, &e->e_version) < size) { @@ -1471,13 +1459,7 @@ load_elf64(struct boot_file_t *file, loadinfo_t *loadinfo) loadaddr = e->e_entry; } - /* On some systems, loadaddr may already be claimed, so try some - * other nearby addresses before giving up. - */ - for(addr=loadaddr; addr <= loadaddr * 8 ;addr+=0x100000) { - loadinfo->base = prom_claim((void *)addr, loadinfo->memsize, 0); - if (loadinfo->base != (void *)-1) break; - } + loadinfo->base = prom_claim_chunk((void *)loadaddr, loadinfo->memsize, 0); if (loadinfo->base == (void *)-1) { prom_printf("Claim error, can't allocate kernel memory\n"); goto bail; @@ -1596,7 +1578,7 @@ setup_display(void) } if (scrn == PROM_INVALID_HANDLE) { - prom_printf("No screen device found !/n"); + prom_printf("No screen device found !\n"); return; } for(i=0;i<16;i++) {