| OLD | NEW |
| 1 /* load.c --- loading object files into the RX simulator. | 1 /* load.c --- loading object files into the RX simulator. |
| 2 | 2 |
| 3 Copyright (C) 2005, 2007-2012 Free Software Foundation, Inc. | 3 Copyright (C) 2005, 2007-2012 Free Software Foundation, Inc. |
| 4 Contributed by Red Hat, Inc. | 4 Contributed by Red Hat, Inc. |
| 5 | 5 |
| 6 This file is part of the GNU simulators. | 6 This file is part of the GNU simulators. |
| 7 | 7 |
| 8 This program is free software; you can redistribute it and/or modify | 8 This program is free software; you can redistribute it and/or modify |
| 9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
| 10 the Free Software Foundation; either version 3 of the License, or | 10 the Free Software Foundation; either version 3 of the License, or |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 | 21 |
| 22 #include "config.h" | 22 #include "config.h" |
| 23 #include <stdlib.h> | 23 #include <stdlib.h> |
| 24 #include <stdio.h> | 24 #include <stdio.h> |
| 25 #include <string.h> | 25 #include <string.h> |
| 26 | 26 |
| 27 #include "bfd.h" | 27 #include "bfd.h" |
| 28 #include "libbfd.h" | 28 #include "libbfd.h" |
| 29 #include "cpu.h" | 29 #include "cpu.h" |
| 30 #include "mem.h" | 30 #include "mem.h" |
| 31 #include "load.h" |
| 31 #include "elf/internal.h" | 32 #include "elf/internal.h" |
| 32 #include "elf/common.h" | 33 #include "elf/common.h" |
| 33 | 34 |
| 35 /* Helper function for invoking a GDB-specified printf. */ |
| 36 static void |
| 37 xprintf (host_callback *callback, const char *fmt, ...) |
| 38 { |
| 39 va_list ap; |
| 40 |
| 41 va_start (ap, fmt); |
| 42 |
| 43 (*callback->vprintf_filtered) (callback, fmt, ap); |
| 44 |
| 45 va_end (ap); |
| 46 } |
| 47 |
| 48 /* Given a file offset, look up the section name. */ |
| 49 static const char * |
| 50 find_section_name_by_offset (bfd *abfd, file_ptr filepos) |
| 51 { |
| 52 asection *s; |
| 53 |
| 54 for (s = abfd->sections; s; s = s->next) |
| 55 if (s->filepos == filepos) |
| 56 return bfd_get_section_name (abfd, s); |
| 57 |
| 58 return "(unknown)"; |
| 59 } |
| 60 |
| 34 /* A note about endianness and swapping... | 61 /* A note about endianness and swapping... |
| 35 | 62 |
| 36 The RX chip is CISC-like in that the opcodes are variable length | 63 The RX chip is CISC-like in that the opcodes are variable length |
| 37 and are read as a stream of bytes. However, the chip itself shares | 64 and are read as a stream of bytes. However, the chip itself shares |
| 38 the code prefetch block with the data fetch block, so when it's | 65 the code prefetch block with the data fetch block, so when it's |
| 39 configured for big endian mode, the memory fetched for opcodes is | 66 configured for big endian mode, the memory fetched for opcodes is |
| 40 word-swapped. To compensate for this, the ELF file has the code | 67 word-swapped. To compensate for this, the ELF file has the code |
| 41 sections pre-swapped. Our BFD knows this, and for the convenience | 68 sections pre-swapped. Our BFD knows this, and for the convenience |
| 42 of all the other tools, hides this swapping at a very low level. | 69 of all the other tools, hides this swapping at a very low level. |
| 43 I.e. it swaps words on the way out and on the way back in. | 70 I.e. it swaps words on the way out and on the way back in. |
| 44 | 71 |
| 45 Fortunately the iovector routines are unaffected by this, so we | 72 Fortunately the iovector routines are unaffected by this, so we |
| 46 can use them to read in the segments directly, without having | 73 can use them to read in the segments directly, without having |
| 47 to worry about byte swapping anything. | 74 to worry about byte swapping anything. |
| 48 | 75 |
| 49 However, our opcode decoder and disassemblers need to swap the data | 76 However, our opcode decoder and disassemblers need to swap the data |
| 50 after reading it from the chip memory, just like the chip does. | 77 after reading it from the chip memory, just like the chip does. |
| 51 All in all, the code words are swapped four times between the | 78 All in all, the code words are swapped four times between the |
| 52 assembler and our decoder. | 79 assembler and our decoder. |
| 53 | 80 |
| 54 If the chip is running in little-endian mode, no swapping is done | 81 If the chip is running in little-endian mode, no swapping is done |
| 55 anywhere. Note also that the *operands* within opcodes are always | 82 anywhere. Note also that the *operands* within opcodes are always |
| 56 encoded in little-endian format. */ | 83 encoded in little-endian format. */ |
| 57 | 84 |
| 58 void | 85 void |
| 59 rx_load (bfd *prog) | 86 rx_load (bfd *prog, host_callback *callback) |
| 60 { | 87 { |
| 61 unsigned long highest_addr_loaded = 0; | 88 unsigned long highest_addr_loaded = 0; |
| 62 Elf_Internal_Phdr * phdrs; | 89 Elf_Internal_Phdr * phdrs; |
| 63 long sizeof_phdrs; | 90 long sizeof_phdrs; |
| 64 int num_headers; | 91 int num_headers; |
| 65 int i; | 92 int i; |
| 66 | 93 |
| 67 rx_big_endian = bfd_big_endian (prog); | 94 rx_big_endian = bfd_big_endian (prog); |
| 68 | 95 |
| 69 /* Note we load by ELF program header not by BFD sections. | 96 /* Note we load by ELF program header not by BFD sections. |
| (...skipping 28 matching lines...) Expand all Loading... |
| 98 file_ptr offset; | 125 file_ptr offset; |
| 99 | 126 |
| 100 size = p->p_filesz; | 127 size = p->p_filesz; |
| 101 if (size <= 0) | 128 if (size <= 0) |
| 102 continue; | 129 continue; |
| 103 | 130 |
| 104 base = p->p_paddr; | 131 base = p->p_paddr; |
| 105 if (verbose > 1) | 132 if (verbose > 1) |
| 106 fprintf (stderr, "[load segment: lma=%08x vma=%08x size=%08x]\n", | 133 fprintf (stderr, "[load segment: lma=%08x vma=%08x size=%08x]\n", |
| 107 (int) base, (int) p->p_vaddr, (int) size); | 134 (int) base, (int) p->p_vaddr, (int) size); |
| 135 if (callback) |
| 136 xprintf (callback, |
| 137 "Loading section %s, size %#lx lma %08lx vma %08lx\n", |
| 138 find_section_name_by_offset (prog, p->p_offset), |
| 139 size, base, p->p_vaddr); |
| 108 | 140 |
| 109 buf = malloc (size); | 141 buf = malloc (size); |
| 110 if (buf == NULL) | 142 if (buf == NULL) |
| 111 { | 143 { |
| 112 fprintf (stderr, "Failed to allocate buffer to hold program segment\n"
); | 144 fprintf (stderr, "Failed to allocate buffer to hold program segment\n"
); |
| 113 continue; | 145 continue; |
| 114 } | 146 } |
| 115 | 147 |
| 116 offset = p->p_offset; | 148 offset = p->p_offset; |
| 117 if (prog->iovec->bseek (prog, offset, SEEK_SET) != 0) | 149 if (prog->iovec->bseek (prog, offset, SEEK_SET) != 0) |
| (...skipping 24 matching lines...) Expand all Loading... |
| 142 heaptop = heapbottom = 0; | 174 heaptop = heapbottom = 0; |
| 143 } | 175 } |
| 144 | 176 |
| 145 reset_decoder (); | 177 reset_decoder (); |
| 146 | 178 |
| 147 if (verbose > 1) | 179 if (verbose > 1) |
| 148 fprintf (stderr, "[start pc=%08x %s]\n", | 180 fprintf (stderr, "[start pc=%08x %s]\n", |
| 149 (unsigned int) regs.r_pc, | 181 (unsigned int) regs.r_pc, |
| 150 rx_big_endian ? "BE" : "LE"); | 182 rx_big_endian ? "BE" : "LE"); |
| 151 } | 183 } |
| OLD | NEW |