~ubuntu-branches/ubuntu/trusty/grub2/trusty-updates

« back to all changes in this revision

Viewing changes to grub-core/kern/mips/dl.c

  • Committer: Package Import Robot
  • Author(s): Colin Watson
  • Date: 2012-09-13 18:02:04 UTC
  • mfrom: (1.17.15 upstream)
  • mto: (17.6.27 experimental)
  • mto: This revision was merged to the branch mainline in revision 145.
  • Revision ID: package-import@ubuntu.com-20120913180204-mojnmocbimlom4im
Tags: upstream-2.00
ImportĀ upstreamĀ versionĀ 2.00

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
#include <grub/err.h>
24
24
#include <grub/cpu/types.h>
25
25
#include <grub/mm.h>
 
26
#include <grub/i18n.h>
26
27
 
27
28
/* Dummy __gnu_local_gp. Resolved by linker.  */
28
29
static char __gnu_local_gp_dummy;
34
35
  Elf_Ehdr *e = ehdr;
35
36
 
36
37
  /* Check the magic numbers.  */
37
 
#ifdef WORDS_BIGENDIAN
 
38
#ifdef GRUB_CPU_WORDS_BIGENDIAN
38
39
  if (e->e_ident[EI_CLASS] != ELFCLASS32
39
40
      || e->e_ident[EI_DATA] != ELFDATA2MSB
40
41
      || e->e_machine != EM_MIPS)
43
44
      || e->e_ident[EI_DATA] != ELFDATA2LSB
44
45
      || e->e_machine != EM_MIPS)
45
46
#endif
46
 
    return grub_error (GRUB_ERR_BAD_OS, "invalid arch specific ELF magic");
 
47
    return grub_error (GRUB_ERR_BAD_OS, N_("invalid arch-dependent ELF magic"));
47
48
 
48
49
  return GRUB_ERR_NONE;
49
50
}
50
51
 
 
52
#pragma GCC diagnostic ignored "-Wcast-align"
 
53
 
51
54
/* Relocate symbols.  */
52
55
grub_err_t
53
56
grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
69
72
      break;
70
73
 
71
74
  if (i == e->e_shnum)
72
 
    return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found");
 
75
    return grub_error (GRUB_ERR_BAD_MODULE, N_("no symbol table"));
73
76
 
74
77
  entsize = s->sh_entsize;
75
78
 
144
147
                 rel < max;
145
148
                 rel++)
146
149
              {
147
 
                Elf_Word *addr;
 
150
                grub_uint8_t *addr;
148
151
                Elf_Sym *sym;
149
152
 
150
153
                if (seg->size < rel->r_offset)
151
154
                  return grub_error (GRUB_ERR_BAD_MODULE,
152
155
                                     "reloc offset is out of the segment");
153
156
 
154
 
                addr = (Elf_Word *) ((char *) seg->addr + rel->r_offset);
 
157
                addr = (grub_uint8_t *) ((char *) seg->addr + rel->r_offset);
155
158
                sym = (Elf_Sym *) ((char *) mod->symtab
156
159
                                     + entsize * ELF_R_SYM (rel->r_info));
157
160
                if (sym->st_value == (grub_addr_t) &__gnu_local_gp_dummy)
163
166
                    {
164
167
                      grub_uint32_t value;
165
168
                      Elf_Rel *rel2;
166
 
                      
 
169
 
 
170
#ifdef GRUB_CPU_WORDS_BIGENDIAN
 
171
                      addr += 2;
 
172
#endif
 
173
 
167
174
                      /* Handle partner lo16 relocation. Lower part is
168
175
                         treated as signed. Hence add 0x8000 to compensate. 
169
176
                       */
175
182
                            && ELF_R_TYPE (rel2->r_info) == R_MIPS_LO16)
176
183
                          {
177
184
                            value += *(grub_int16_t *)
178
 
                              ((char *) seg->addr + rel2->r_offset);
 
185
                              ((char *) seg->addr + rel2->r_offset
 
186
#ifdef GRUB_CPU_WORDS_BIGENDIAN
 
187
                               + 2
 
188
#endif
 
189
                               );
179
190
                            break;
180
191
                          }
181
192
                      *(grub_uint16_t *) addr = (value >> 16) & 0xffff;
182
193
                    }
183
194
                    break;
184
195
                  case R_MIPS_LO16:
 
196
#ifdef GRUB_CPU_WORDS_BIGENDIAN
 
197
                    addr += 2;
 
198
#endif
185
199
                    *(grub_uint16_t *) addr += (sym->st_value) & 0xffff;
186
200
                    break;
187
201
                  case R_MIPS_32:
208
222
                  case R_MIPS_GOT16:
209
223
                  case R_MIPS_CALL16:
210
224
                    /* FIXME: reuse*/
 
225
#ifdef GRUB_CPU_WORDS_BIGENDIAN
 
226
                    addr += 2;
 
227
#endif
211
228
                    *gpptr = sym->st_value + *(grub_uint16_t *) addr;
212
229
                    *(grub_uint16_t *) addr
213
230
                      = sizeof (grub_uint32_t) * (gpptr - gp);
219
236
                    {
220
237
                      grub_free (gp);
221
238
                      return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
222
 
                                         "Unknown relocation type %d\n",
 
239
                                         N_("relocation 0x%x is not implemented yet"),
223
240
                                         ELF_R_TYPE (rel->r_info));
224
241
                    }
225
242
                    break;
234
251
void 
235
252
grub_arch_dl_init_linker (void)
236
253
{
237
 
  grub_dl_register_symbol ("__gnu_local_gp", &__gnu_local_gp_dummy, 0);
 
254
  grub_dl_register_symbol ("__gnu_local_gp", &__gnu_local_gp_dummy, 0, 0);
238
255
}
239
256