diff --git a/elf_loader.c b/elf_loader.c index 8617f1a..33c1abf 100644 --- a/elf_loader.c +++ b/elf_loader.c @@ -63,7 +63,7 @@ void load_elf32_uninitialized_memory(uint32_t address, uint32_t length) * @param loader_addr address of the loader binary in memory * @return */ -int load_elf32_file(struct file *fp, char *cmd_line) +void load_elf32_file(struct file *fp, char *cmd_line) { struct elf32_header hdr; uint32_t mem_sz = 0; @@ -77,20 +77,20 @@ int load_elf32_file(struct file *fp, char *cmd_line) { printf("Bad ELF magic found. Found: %#2x %#2x %#2x %#2x.\n", hdr.ident[0], hdr.ident[1], hdr.ident[2], hdr.ident[3]); - return -1; + return; } /* check machine class: */ if (!hdr.ident[ELF_INDEX_CLASS] == ELF_CLASS_32) { printf("Invalid ELF machine class found. Found: %2x.\n", hdr.ident[ELF_INDEX_CLASS]); - return -1; + return; } /* check endianess: */ if (hdr.ident[ELF_INDEX_DATA] != ELF_DATA_MSB) { printf("Non-big endian ELF file detected. Aborting load.\n"); - return -1; + return; } if (hdr.ehsize != 52 /* bytes */) { @@ -100,7 +100,7 @@ int load_elf32_file(struct file *fp, char *cmd_line) if (hdr.phnum == 0) { printf("Found zero segments in ELF file. Aborting load.\n"); - return -1; + return; } int i; @@ -142,8 +142,6 @@ int load_elf32_file(struct file *fp, char *cmd_line) ((void (*)(uint32_t mem_sz, char *cmd_line))(hdr.entry)) (c_memsz(), cmd_line); - - return -1; /* something failed, badly */ } /** @@ -187,7 +185,7 @@ void load_elf64_uninitialized_memory(uint64_t address, uint64_t length) } } -int load_elf64_file(struct file *fp, char *cmd_line) +void load_elf64_file(struct file *fp, char *cmd_line) { struct elf64_hdr hdr; uint32_t mem_sz = 0; @@ -203,20 +201,20 @@ int load_elf64_file(struct file *fp, char *cmd_line) { printf("Bad ELF magic found. Found: %#2x %#2x %#2x %#2x.\n", hdr.e_ident[0], hdr.e_ident[1], hdr.e_ident[2], hdr.e_ident[3]); - return -1; + return; } /* check machine class: */ if (!hdr.e_ident[ELF_INDEX_CLASS] == ELF_CLASS_64) { printf("Invalid ELF machine class found. Found: %2x.\n", hdr.e_ident[ELF_INDEX_CLASS]); - return -1; + return; } /* check endianess: */ if (hdr.e_ident[ELF_INDEX_DATA] != ELF_DATA_MSB) { printf("Non-big endian ELF file detected. Aborting load.\n"); - return -1; + return; } if (hdr.e_ehsize != 52 /* bytes */) { @@ -226,7 +224,7 @@ int load_elf64_file(struct file *fp, char *cmd_line) if (hdr.e_phnum == 0) { printf("Found zero segments in ELF file. Aborting load.\n"); - return -1; + return; } cilo_seek(fp, hdr.e_phoff, SEEK_SET); @@ -249,5 +247,4 @@ int load_elf64_file(struct file *fp, char *cmd_line) - return -1; } diff --git a/include/elf_loader.h b/include/elf_loader.h index fd6fedb..636b000 100644 --- a/include/elf_loader.h +++ b/include/elf_loader.h @@ -4,9 +4,7 @@ #include #include -void load_elf32_section(struct file *fp, uint32_t address, - uint32_t file_offset, uint32_t length); -void load_elf32_uninitialized_memory(uint32_t address, uint32_t length); -int load_elf32_file(struct file *fp, char *cmd_line); +void load_elf32_file(struct file *fp, char *cmd_line); +void load_elf64_file(struct file *fp, char *cmd_line); #endif /* _ELF_LOADER_H */ diff --git a/lzma_loader.c b/lzma_loader.c index 6803a7e..a509352 100644 --- a/lzma_loader.c +++ b/lzma_loader.c @@ -107,7 +107,7 @@ void load_lzma(struct file *fp, uint32_t load_address, char *cmd_line) } /* kick into kernel: */ - printf("\nStarting kernel at 0x%016x.\n", load_address); + printf("100\nStarting kernel at 0x%016x.\n\n", load_address); ((void (*)(uint32_t mem_sz, char *cmd_line))(load_address)) (c_memsz(), cmd_line); } diff --git a/mach/c1700/promlib.c b/mach/c1700/promlib.c index feceb48..f0b51b4 100644 --- a/mach/c1700/promlib.c +++ b/mach/c1700/promlib.c @@ -80,8 +80,8 @@ int c_gets(char *b, int n) if (b[i - 1] == '\n' || b[i-1] == '\r') { break; } - else if (b[i - 1] == 0x8) { - i--; + else if (b[i - 1] == 0x8 || b[i - 1] == 0x7f) { + i-=2; } } while (i < n); diff --git a/mach/c3600/promlib.c b/mach/c3600/promlib.c index e400e8a..7a1480b 100644 --- a/mach/c3600/promlib.c +++ b/mach/c3600/promlib.c @@ -95,7 +95,7 @@ int c_gets(char *b, int n) break; } else if (b[i - 1] == 0x8 || b[i - 1] == 0x7f) { - i--; + i-=2; } } while (i < n); diff --git a/main.c b/main.c index 510dbc4..f5f6cec 100644 --- a/main.c +++ b/main.c @@ -15,30 +15,6 @@ #include -/** - * Dump 0x10 bytes of memory in canonical hexadecimal form - * @param addr Starting address to dump from - */ -void hex_dump(uint32_t addr) -{ - uint8_t *rgn = (uint8_t *)addr; - int i; - - /* print out the address of the 16 bytes of interest */ - printf("%8x " , addr); - - /* print out hex value for individual bytes */ - for (i = 0; i < 16; i++) { - printf("%02x ", rgn[i]); - } - /* print out as chars */ - for (i = 0; i < 16; i++) { - printf("%c", rgn[i] >= 32 && rgn[i] <= 126 ? rgn[i] : '.'); - } - printf("\n"); - -} - /** * Entry Point for CiscoLoad */ @@ -83,7 +59,6 @@ enter_filename: c_gets(buf, 128); int baud = c_baud(); /* get console baud rate */ - printf("Boot console baud rate: %d\n", baud); /* determine if a command line string has been appended to kernel name */ if ((cmd_line_append = strchr(buf, ' ')) != NULL) { @@ -104,8 +79,6 @@ enter_filename: sprintf(cmd_line, "console=ttyS0,%d", baud); } - printf("\n\nAttempting to load file %s\n", kernel); - struct file kernel_file = cilo_open(kernel); if (kernel_file.code == -1) { @@ -126,12 +99,14 @@ enter_filename: cilo_seek(&kernel_file, 0, SEEK_SET); /* check if this is a 32-bit or 64-bit kernel image. */ - if (load_elf32_file(&kernel_file, cmd_line) - < 0) - { - printf("Fatal error while loading kernel. Aborting.\n"); + if (hdr.ident[ELF_INDEX_CLASS] == ELF_CLASS_32) { + load_elf32_file(&kernel_file, cmd_line); + } else { + load_elf64_file(&kernel_file, cmd_line); } } + printf("Fatal error while loading kernel. Aborting.\n"); + goto enter_filename; }