summaryrefslogtreecommitdiff
path: root/gnu/usr.bin/ld/sparc/md-static-funcs.c
blob: e73fa50b4688439fe1d4dfbe72d22ca75ba50c2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/* *	$OpenBSD: md-static-funcs.c,v 1.4 2002/07/19 19:28:12 marc Exp $*/

/*
 *
 * Simple SPARC relocations for the benefit of self-relocation of ld.so
 * avoiding the use of global variables (ie. reloc_bitshift[] et. al.).
 * Only types supported are RELOC_32 and RELOC_RELATIVE.
 *
 * This *must* be a static function, so it is not called through a jmpslot.
 */
static void
md_relocate_simple(struct relocation_info *r, long relocation, char *addr)
{
	unsigned long	mask;
	unsigned long	shift;

	switch (r->r_type) {
	case RELOC_32:
		mask = 0xffffffff;
		shift = 0;
		break;
	case RELOC_RELATIVE:
		mask = 0x003fffff;
		shift = 10;
		break;
	}
	relocation += (*(long *)addr & mask) << shift;
	relocation >>= shift;
	relocation &= mask;

	*(long *) (addr) &= ~mask;
	*(long *) (addr) |= relocation;
}