Fri Nov 21 23:18:11 2008 UTC ()
G/c all reloc types except R_SH_DIR32 - which is the only one we
expect from a kmod that only have unresolved external symbols.


(uwe)
diff -r1.3 -r1.4 src/sys/arch/sh3/sh3/kobj_machdep.c

cvs diff -r1.3 -r1.4 src/sys/arch/sh3/sh3/kobj_machdep.c (expand / switch to unified diff)

--- src/sys/arch/sh3/sh3/kobj_machdep.c 2008/04/28 20:23:35 1.3
+++ src/sys/arch/sh3/sh3/kobj_machdep.c 2008/11/21 23:18:11 1.4
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: kobj_machdep.c,v 1.3 2008/04/28 20:23:35 martin Exp $ */ 1/* $NetBSD: kobj_machdep.c,v 1.4 2008/11/21 23:18:11 uwe Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2008 The NetBSD Foundation, Inc. 4 * Copyright (c) 2008 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
@@ -17,27 +17,27 @@ @@ -17,27 +17,27 @@
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29#include <sys/cdefs.h> 29#include <sys/cdefs.h>
30__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.3 2008/04/28 20:23:35 martin Exp $"); 30__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.4 2008/11/21 23:18:11 uwe Exp $");
31 31
32#define ELFSIZE ARCH_ELFSIZE 32#define ELFSIZE ARCH_ELFSIZE
33 33
34#include <sys/param.h> 34#include <sys/param.h>
35#include <sys/systm.h> 35#include <sys/systm.h>
36#include <sys/kobj.h> 36#include <sys/kobj.h>
37#include <sys/exec.h> 37#include <sys/exec.h>
38#include <sys/exec_elf.h> 38#include <sys/exec_elf.h>
39 39
40#include <sh3/cache.h> 40#include <sh3/cache.h>
41 41
42int 42int
43kobj_reloc(kobj_t ko, uintptr_t relocbase, const void *data, 43kobj_reloc(kobj_t ko, uintptr_t relocbase, const void *data,
@@ -52,63 +52,35 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas @@ -52,63 +52,35 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
52 printf("kobj_reloc: support only RELA relocations\n"); 52 printf("kobj_reloc: support only RELA relocations\n");
53 return -1; 53 return -1;
54 } 54 }
55 55
56 rela = data; 56 rela = data;
57 where = (Elf_Addr *)(relocbase + rela->r_offset); 57 where = (Elf_Addr *)(relocbase + rela->r_offset);
58 symidx = ELF_R_SYM(rela->r_info); 58 symidx = ELF_R_SYM(rela->r_info);
59 rtype = ELF_R_TYPE(rela->r_info); 59 rtype = ELF_R_TYPE(rela->r_info);
60 60
61 switch (rtype) { 61 switch (rtype) {
62 case R_TYPE(NONE): 62 case R_TYPE(NONE):
63 break; 63 break;
64 64
65 case R_TYPE(REL32): 
66 addr = kobj_sym_lookup(ko, symidx); 
67 if (addr == 0) 
68 return -1; 
69 
70 tmp = (Elf_Addr)(relocbase + addr + rela->r_addend) - 
71 (Elf_Addr)where; 
72 if (*where != tmp) 
73 *where = tmp; 
74 break; 
75 
76 case R_TYPE(DIR32): 65 case R_TYPE(DIR32):
77 addr = kobj_sym_lookup(ko, symidx); 66 addr = kobj_sym_lookup(ko, symidx);
78 if (addr == 0) 67 if (addr == 0)
79 return -1; 68 return -1;
80 69
81 tmp = (Elf_Addr)(addr + *where + rela->r_addend); 70 tmp = (Elf_Addr)(addr + *where + rela->r_addend);
82 *where = tmp; 71 *where = tmp;
83 break; 72 break;
84 73
85 case R_TYPE(GLOB_DAT): 
86 addr = kobj_sym_lookup(ko, symidx); 
87 if (addr == 0) 
88 return -1; 
89 
90 tmp = (Elf_Addr)(relocbase + addr + rela->r_addend); 
91 if (*where != tmp) 
92 *where = tmp; 
93 break; 
94 
95 case R_TYPE(RELATIVE): 
96 if (rela->r_addend) 
97 *where = (Elf_Addr)(relocbase + rela->r_addend); 
98 else 
99 *where += (Elf_Addr)relocbase; 
100 break; 
101 
102 default: 74 default:
103 printf("kobj_reloc: unexpected reloc type %d\n", (int)rtype); 75 printf("kobj_reloc: unexpected reloc type %d\n", (int)rtype);
104 return -1; 76 return -1;
105 } 77 }
106 78
107 return 0; 79 return 0;
108} 80}
109 81
110int 82int
111kobj_machdep(kobj_t ko, void *base, size_t size, bool load) 83kobj_machdep(kobj_t ko, void *base, size_t size, bool load)
112{ 84{
113 85
114 if (load) 86 if (load)