xref: /plan9-contrib/sys/src/libdynld/dynld-arm.c (revision 50f1557124e7462c91000f47378638e1dd5a6016)
1*50f15571SDavid du Colombier #include <u.h>
2*50f15571SDavid du Colombier #include <libc.h>
3*50f15571SDavid du Colombier #include <a.out.h>
4*50f15571SDavid du Colombier #include <dynld.h>
5*50f15571SDavid du Colombier 
6*50f15571SDavid du Colombier #define	CHK(i,ntab)	if((unsigned)(i)>=(ntab))return "bad relocation index"
7*50f15571SDavid du Colombier 
8*50f15571SDavid du Colombier long
dynmagic(void)9*50f15571SDavid du Colombier dynmagic(void)
10*50f15571SDavid du Colombier {
11*50f15571SDavid du Colombier 	return DYN_MAGIC | E_MAGIC;
12*50f15571SDavid du Colombier }
13*50f15571SDavid du Colombier 
14*50f15571SDavid du Colombier char*
dynreloc(uchar * b,ulong p,int m,Dynsym ** tab,int ntab)15*50f15571SDavid du Colombier dynreloc(uchar *b, ulong p, int m, Dynsym **tab, int ntab)
16*50f15571SDavid du Colombier {
17*50f15571SDavid du Colombier 	int i;
18*50f15571SDavid du Colombier 	ulong v, *pp;
19*50f15571SDavid du Colombier 
20*50f15571SDavid du Colombier 	p <<= 2;
21*50f15571SDavid du Colombier 	p += (ulong)b;
22*50f15571SDavid du Colombier 	pp = (ulong*)p;
23*50f15571SDavid du Colombier 	v = *pp;
24*50f15571SDavid du Colombier 	switch(m){
25*50f15571SDavid du Colombier 	case 0:
26*50f15571SDavid du Colombier 		v += (ulong)b;
27*50f15571SDavid du Colombier 		break;
28*50f15571SDavid du Colombier 	case 1:
29*50f15571SDavid du Colombier 		i = v>>22;
30*50f15571SDavid du Colombier 		v &= 0x3fffff;
31*50f15571SDavid du Colombier 		CHK(i, ntab);
32*50f15571SDavid du Colombier 		v += tab[i]->addr;
33*50f15571SDavid du Colombier 		break;
34*50f15571SDavid du Colombier 	case 2:
35*50f15571SDavid du Colombier 		i = v&0x3ff;
36*50f15571SDavid du Colombier 		v &= ~0x3ff;
37*50f15571SDavid du Colombier 		CHK(i, ntab);
38*50f15571SDavid du Colombier 		v |= ((tab[i]->addr-p-8)>>2)&0xffffff;
39*50f15571SDavid du Colombier 		break;
40*50f15571SDavid du Colombier 	default:
41*50f15571SDavid du Colombier 		return "invalid relocation mode";
42*50f15571SDavid du Colombier 	}
43*50f15571SDavid du Colombier 	*pp = v;
44*50f15571SDavid du Colombier 	return nil;
45*50f15571SDavid du Colombier }
46