head	1.10;
access;
symbols
	perseant-exfatfs-base-20250801:1.10
	perseant-exfatfs-base-20240630:1.10
	cjep_sun2x:1.10.0.44
	cjep_sun2x-base:1.10
	cjep_staticlib_x-base1:1.10
	cjep_staticlib_x:1.10.0.42
	cjep_staticlib_x-base:1.10
	phil-wifi-20200421:1.10
	phil-wifi-20200411:1.10
	phil-wifi-20200406:1.10
	pgoyette-compat-merge-20190127:1.10
	pgoyette-compat-20190127:1.10
	pgoyette-compat-20190118:1.10
	pgoyette-compat-1226:1.10
	pgoyette-compat-1126:1.10
	pgoyette-compat-1020:1.10
	pgoyette-compat-0930:1.10
	pgoyette-compat-0906:1.10
	pgoyette-compat-0728:1.10
	pgoyette-compat-0625:1.10
	pgoyette-compat-0521:1.10
	pgoyette-compat-0502:1.10
	pgoyette-compat-0422:1.10
	pgoyette-compat-0415:1.10
	pgoyette-compat-0407:1.10
	pgoyette-compat-0330:1.10
	pgoyette-compat-0322:1.10
	pgoyette-compat-0315:1.10
	pgoyette-compat:1.10.0.40
	pgoyette-compat-base:1.10
	perseant-stdc-iso10646:1.10.0.38
	perseant-stdc-iso10646-base:1.10
	prg-localcount2-base3:1.10
	prg-localcount2-base2:1.10
	prg-localcount2-base1:1.10
	prg-localcount2:1.10.0.36
	prg-localcount2-base:1.10
	pgoyette-localcount-20170426:1.10
	bouyer-socketcan-base1:1.10
	pgoyette-localcount-20170320:1.10
	bouyer-socketcan:1.10.0.34
	bouyer-socketcan-base:1.10
	pgoyette-localcount-20170107:1.10
	pgoyette-localcount-20161104:1.10
	localcount-20160914:1.10
	pgoyette-localcount-20160806:1.10
	pgoyette-localcount-20160726:1.10
	pgoyette-localcount:1.10.0.32
	pgoyette-localcount-base:1.10
	netbsd-5-2-3-RELEASE:1.10
	netbsd-5-1-5-RELEASE:1.10
	yamt-pagecache-base9:1.10
	yamt-pagecache-tag8:1.10
	tls-earlyentropy:1.10.0.28
	tls-earlyentropy-base:1.10
	riastradh-xf86-video-intel-2-7-1-pre-2-21-15:1.10
	riastradh-drm2-base3:1.10
	netbsd-5-2-2-RELEASE:1.10
	netbsd-5-1-4-RELEASE:1.10
	netbsd-5-2-1-RELEASE:1.10
	netbsd-5-1-3-RELEASE:1.10
	agc-symver:1.10.0.30
	agc-symver-base:1.10
	tls-maxphys-base:1.10
	yamt-pagecache-base8:1.10
	netbsd-5-2:1.10.0.26
	yamt-pagecache-base7:1.10
	netbsd-5-2-RELEASE:1.10
	netbsd-5-2-RC1:1.10
	yamt-pagecache-base6:1.10
	yamt-pagecache-base5:1.10
	yamt-pagecache-base4:1.10
	netbsd-5-1-2-RELEASE:1.10
	netbsd-5-1-1-RELEASE:1.10
	yamt-pagecache-base3:1.10
	yamt-pagecache-base2:1.10
	yamt-pagecache:1.10.0.24
	yamt-pagecache-base:1.10
	bouyer-quota2-nbase:1.10
	bouyer-quota2:1.10.0.22
	bouyer-quota2-base:1.10
	matt-nb5-pq3:1.10.0.20
	matt-nb5-pq3-base:1.10
	netbsd-5-1:1.10.0.18
	netbsd-5-1-RELEASE:1.10
	netbsd-5-1-RC4:1.10
	netbsd-5-1-RC3:1.10
	netbsd-5-1-RC2:1.10
	netbsd-5-1-RC1:1.10
	netbsd-5-0-2-RELEASE:1.10
	netbsd-5-0-1-RELEASE:1.10
	jym-xensuspend-nbase:1.10
	netbsd-5-0:1.10.0.16
	netbsd-5-0-RELEASE:1.10
	netbsd-5-0-RC4:1.10
	netbsd-5-0-RC3:1.10
	netbsd-5-0-RC2:1.10
	jym-xensuspend:1.10.0.14
	jym-xensuspend-base:1.10
	netbsd-5-0-RC1:1.10
	netbsd-5:1.10.0.12
	netbsd-5-base:1.10
	mjf-devfs2:1.10.0.10
	mjf-devfs2-base:1.10
	yamt-pf42-base4:1.10
	yamt-pf42-base3:1.10
	hpcarm-cleanup-nbase:1.10
	yamt-pf42-base2:1.10
	yamt-pf42:1.10.0.8
	yamt-pf42-base:1.10
	keiichi-mipv6:1.10.0.6
	keiichi-mipv6-base:1.10
	cube-autoconf:1.10.0.4
	cube-autoconf-base:1.10
	hpcarm-cleanup:1.10.0.2
	hpcarm-cleanup-base:1.10
	netbsd-1-3-PATCH003:1.3
	netbsd-1-3-PATCH003-CANDIDATE2:1.3
	netbsd-1-3-PATCH003-CANDIDATE1:1.3
	netbsd-1-3-PATCH003-CANDIDATE0:1.3
	ARM32-BROKEN-RELOCS:1.3.0.4
	netbsd-1-3-PATCH002:1.3
	netbsd-1-3-PATCH001:1.3
	netbsd-1-3-RELEASE:1.3
	netbsd-1-3-BETA:1.3
	netbsd-1-3:1.3.0.2
	netbsd-1-3-base:1.3;
locks; strict;
comment	@ * @;


1.10
date	98.12.17.15.38.55;	author pk;	state dead;
branches;
next	1.9;

1.9
date	98.12.03.15.56.51;	author mycroft;	state Exp;
branches;
next	1.8;

1.8
date	98.12.03.15.46.28;	author mycroft;	state Exp;
branches;
next	1.7;

1.7
date	98.10.19.03.09.31;	author matt;	state Exp;
branches;
next	1.6;

1.6
date	98.08.26.14.37.40;	author matt;	state Exp;
branches;
next	1.5;

1.5
date	98.08.05.04.25.03;	author mycroft;	state Exp;
branches;
next	1.4;

1.4
date	98.08.05.04.21.51;	author mycroft;	state Exp;
branches;
next	1.3;

1.3
date	97.10.17.21.25.49;	author mark;	state Exp;
branches;
next	1.2;

1.2
date	96.08.21.18.43.29;	author mark;	state Exp;
branches;
next	1.1;

1.1
date	96.05.17.21.51.07;	author mark;	state Exp;
branches;
next	;


desc
@@


1.10
log
@These files now live in `src/libexec/ld.aout_so/arch'
@
text
@/*	$NetBSD: md.c,v 1.9 1998/12/03 15:56:51 mycroft Exp $	*/

/*
 * Copyright (C) 1997 Mark Brinicombe
 * Copyright (C) 1997 Causality Limited
 * Copyright (C) 1996 Wolfgang Solfrank
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by Wolfgang Solfrank.
 *	This product includes software developed by Causality Limited.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/* Second cut for arm32 (used to be a simple copy of i386 code) */

#include <sys/param.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <err.h>
#include <fcntl.h>
#include <a.out.h>
#include <stab.h>
#include <string.h>
#ifdef RTLD
#include <machine/sysarch.h>
#include <sys/syscall.h>
#endif	/* RTLD */

#include "ld.h"

#ifdef RTLD
/*
 * Flush the instruction cache of the specified address
 * Some processors have separate instruction caches and
 * as such may need a flush following a jump slot fixup.
 */
__inline void
iflush(addr, len)
	void *addr;
	int len;
{
	struct arm32_sync_icache_args p;

	/*
	 * This is not an efficient way to flush a chunk of memory
	 * if we need to flush lots of small chunks i.e. a jmpslot
	 * per function call.
	 */
	p.addr = (u_int)addr;
	p.len = len;

	__asm __volatile("mov r0, %0; mov r1, %1; swi %2"
	 : : "I" (ARM32_SYNC_ICACHE), "r" (&p), "J" (SYS_sysarch));
}
#endif	/* RTLD */


/*
 * Get relocation addend corresponding to relocation record RP
 * from address ADDR
 */
long
md_get_addend(rp, addr)
struct relocation_info	*rp;
unsigned char		*addr;
{
	long rel;
	
	switch (rp->r_length) {
	case 0:
		rel = get_byte(addr);
		break;
	case 1:
		rel = get_short(addr);
		break;
	case 2:
		rel = get_long(addr);
		break;
	case 3:			/* looks like a special hack for b & bl */
		rel = (((long)get_long(addr) & 0xffffff) << 8) >> 6;
		/*
		 * XXX
		 * Address the addend to be relative to the start of the file
		 * The implecation of doing this is that this adjustment is
		 * done every time the reloc goes through ld.
		 * This means that the adjustment can be applied multiple
		 * times if ld -r is used to do a partial link.
		 *
		 * Solution:
		 * 1. Put a hack in md_relocate so that PC relative
		 *    relocations are not modified if
		 *    relocatable_output == 1
		 * 2. Modify the assembler to apply this adjustment.
		 */
		rel -= rp->r_address;
		break;
	default:
		errx(1, "Unsupported relocation size: %x",
		    rp->r_length);
	}
	return rp->r_neg ? -rel : rel; /* Hack to make r_neg work */
}

/*
 * Put RELOCATION at ADDR according to relocation record RP.
 */
void
md_relocate(rp, relocation, addr, relocatable_output)
struct relocation_info	*rp;
long			relocation;
unsigned char		*addr;
int			relocatable_output;
{
	/*
	 * XXX
	 * See comments above in md_get_addend
	 */
#ifndef RTLD
	if (RELOC_PCREL_P(rp) && relocatable_output)
		relocation += (rp->r_address + pc_relocation);
	if (rp->r_pcrel && rp->r_length == 2 && relocatable_output)
		relocation -= rp->r_address;
#endif

	if (rp->r_neg)		/* Not sure, whether this works in all cases XXX */
		relocation = -relocation;
	
	switch (rp->r_length) {
	case 0:
		put_byte(addr, relocation);
		break;
	case 1:
		put_short(addr, relocation);
		break;
	case 2:
		put_long(addr, relocation);
		break;
	case 3:
		put_long(addr,
			 (get_long(addr)&0xff000000)
			 | ((relocation>>2)&0xffffff));
		break;
	default:
		errx(1, "Unsupported relocation size: %x",
		    rp->r_length);
	}
}

#ifndef	RTLD
/*
 * Machine dependent part of claim_rrs_reloc().
 * Set RRS relocation type.
 */
int
md_make_reloc(rp, r, type)
struct relocation_info	*rp, *r;
int			type;
{
	/* Copy most attributes */
	r->r_pcrel = rp->r_pcrel;
	r->r_length = rp->r_length;
	r->r_neg = rp->r_neg;
	r->r_baserel = rp->r_baserel;
	r->r_jmptable = rp->r_jmptable;
	r->r_relative = rp->r_relative;

	return 0;
}
#endif	/* RTLD */

/*
 * Set up a transfer from jmpslot at OFFSET (relative to the PLT table)
 * to the binder slot (which is at offset 0 of the PLT).
 */
void
md_make_jmpslot(sp, offset, index)
jmpslot_t	*sp;
long		offset;
long		index;
{
	/*
	 * Build the jump slot as follows
	 *
	 *	ldr	ip, [pc]
	 *	add	pc, pc, ip
	 *	.word	rel_addr
	 *	.word	reloc_index
	 */
	sp->opcode1 = GETRELADDR;
	sp->opcode2 = ADDPC;
	sp->address = - (offset + 12);
	sp->reloc_index = index;
#ifdef RTLD
	iflush(sp, sizeof(jmpslot_t));
#endif	/* RTLD */
}

/*
 * Set up a "direct" transfer (ie. not through the run-time binder) from
 * jmpslot at OFFSET to ADDR. Used by `ld' when the SYMBOLIC flag is on,
 * and by `ld.so' after resolving the symbol.
 */

#ifdef RTLD
extern       void		binder_entry __P((void));
#endif

void
md_fix_jmpslot(sp, offset, addr, first)
jmpslot_t	*sp;
long		offset;
u_long		addr;
int		first;
{
	/*
	 * For jmpslot 0 (the binder)
	 * generate
	 *	sub	ip, pc, ip
	 *	ldr	pc, [pc, #-4]
	 *	.word	addr
	 *	<unused>
	 *
	 * For jump slots generated by the linker (i.e. -Bsymbolic)
	 * build a direct jump to the absolute address
	 * i.e.
	 *	ldr	pc, [pc]
	 *	<unused>
	 *	.word	new_addr
	 *	<unused>
	 *
	 * For jump slots generated by ld.so at run time,
	 * just modify the address offset since the slot
	 * will have been created with md_make_jmpslot().
	 * i.e.
	 *	ldr	ip, [pc]
	 *	add	pc, pc, ip
	 *	.word	new_rel_addr
	 *	<unused>
	 */
	if (first) {
		/* Build binder jump slot */
		sp->opcode1 = GETSLOTADDR;
		sp->opcode2 = LDRPCADDR;
		sp->address = addr;
#ifdef RTLD
		iflush(sp, sizeof(jmpslot_t));
#endif	/* RTLD */
	} else {
#ifdef RTLD
		/*
		 * Change the relative offset to the binder
		 * into a relative offset to the function
		 */
		sp->address = (addr - (long)sp - 12);
#else
		/*
		 * Build a direct transfer jump slot
		 * as we not doing a run time fixup.
		 */
		sp->opcode1 = JUMP;
		sp->address = addr;
#endif	/* RTLD */
	}
}

/*
 * Update the relocation record for a RRS jmpslot.
 */
void
md_make_jmpreloc(rp, r, type)
struct relocation_info	*rp, *r;
int			type;
{
	r->r_address += 8;
	r->r_pcrel = 0;
	r->r_length = 2;
	r->r_neg = 0;
	r->r_baserel = 0;
	r->r_jmptable = 1;
	r->r_relative = 0;
}

/*
 * Set relocation type for a RRS GOT relocation.
 */
void
md_make_gotreloc(rp, r, type)
struct relocation_info	*rp, *r;
int			type;
{
	r->r_pcrel = 0;
	r->r_length = 2;
	r->r_neg = 0;
	r->r_baserel = 1;
	r->r_jmptable = 0;
	r->r_relative = 0;

}

/*
 * Set relocation type for a RRS copy operation.
 */
void
md_make_cpyreloc(rp, r)
struct relocation_info	*rp, *r;
{
	r->r_pcrel = 0;
	r->r_length = 2;
	r->r_neg = 0;
	r->r_baserel = 0;
	r->r_jmptable = 0;
	r->r_relative = 0;
}

void
md_set_breakpoint(where, savep)
long	where;
long	*savep;
{
	*savep = *(long *)where;
	*(long *)where = TRAP;
#ifdef RTLD
	iflush((long *)where, sizeof(long));
#endif	/* RTLD */	
}

#ifndef RTLD

/*
 * Initialize (output) exec header such that useful values are
 * obtained from subsequent N_*() macro evaluations.
 */
void
md_init_header(hp, magic, flags)
struct exec	*hp;
int		magic, flags;
{
	N_SETMAGIC((*hp), magic, MID_ARM6, flags);

	/* TEXT_START depends on the value of outheader.a_entry.  */
	if (!(link_mode & SHAREABLE))
		hp->a_entry = PAGSIZ;
}
#endif	/* RTLD */


#ifdef NEED_SWAP
/*
 * Byte swap routines for cross-linking.
 */

void
md_swapin_exec_hdr(h)
struct exec *h;
{
	/* NetBSD: Always leave magic alone */
	int skip = 1;

	swap_longs((long *)h + skip, sizeof(*h)/sizeof(long) - skip);
}

void
md_swapout_exec_hdr(h)
struct exec *h;
{
	/* NetBSD: Always leave magic alone */
	int skip = 1;

	swap_longs((long *)h + skip, sizeof(*h)/sizeof(long) - skip);
}

void
md_swapout_jmpslot(j, n)
jmpslot_t	*j;
int		n;
{
	for (; n; n--, j++) {
		j->opcode1 = md_swap_long(j->opcode1);
		j->opcode2 = md_swap_long(j->opcode2);
		j->address = md_swap_long(j->address);
		j->reloc_index = md_swap_long(j->reloc_index);
	}
}

#endif /* NEED_SWAP */

/*
 * md_swapin_reloc()
 *
 * As well as provide bit swapping for cross compiling with different
 * endianness we need to munge some of the reloc bits.
 * This munging is due to the assemble packing all the PIC related
 * relocs so that only 1 extra bit in the reloc structure is needed
 * The result is that jmpslot branches are packed as a baserel branch
 * Spot this case and internally use a jmptable bit.
 */

void
md_swapin_reloc(r, n)
struct relocation_info *r;
int n;
{
	int	bits;

	for (; n; n--, r++) {
#ifdef NEED_SWAP
		r->r_address = md_swap_long(r->r_address);
		bits = ((int *)r)[1];
		r->r_symbolnum = md_swap_long(bits) & 0x00ffffff;
		r->r_pcrel = (bits & 1);
		r->r_length = (bits >> 1) & 3;
		r->r_extern = (bits >> 3) & 1;
		r->r_neg = (bits >> 4) & 1;
		r->r_baserel = (bits >> 5) & 1;
		r->r_jmptable = (bits >> 6) & 1;
		r->r_relative = (bits >> 7) & 1;
#endif
		/* Look for PIC relocation */
		if (r->r_baserel) {
			/* Look for baserel branch */
			if (r->r_length == 3 && r->r_pcrel == 0) {
				r->r_jmptable = 1;
			}
			/* Look for GOTPC reloc */
			if (r->r_length == 2 && r->r_pcrel == 1)
				r->r_baserel = 0;
		}
	}
}

void
md_swapout_reloc(r, n)
struct relocation_info *r;
int n;
{
	int	bits;

	for (; n; n--, r++) {
		/* Look for jmptable relocation */
		if (r->r_jmptable && r->r_pcrel == 0 && r->r_length == 3) {
			r->r_jmptable = 0;
			r->r_baserel = 1;
		}
#ifdef NEED_SWAP
		r->r_address = md_swap_long(r->r_address);
		bits = md_swap_long(r->r_symbolnum) & 0xffffff00;
		bits |= (r->r_pcrel & 1);
		bits |= (r->r_length & 3) << 1;
		bits |= (r->r_extern & 1) << 3;
		bits |= (r->r_neg & 1) << 4;
		bits |= (r->r_baserel & 1) << 5;
		bits |= (r->r_jmptable & 1) << 6;
		bits |= (r->r_relative & 1) << 7;
		((int *)r)[1] = bits;
#endif
	}
}
@


1.9
log
@Put back code to use pc-relative branches in the PLT, and avoid doing cache
flushes.
@
text
@d1 1
a1 1
/*	$NetBSD: md.c,v 1.8 1998/12/03 15:46:28 mycroft Exp $	*/
@


1.8
log
@Use the `first' argument to md_fix_jmpslot().
@
text
@d1 1
a1 1
/*	$NetBSD: md.c,v 1.7 1998/10/19 03:09:31 matt Exp $	*/
d209 1
a209 1
	 *	.word	new_addr
d253 9
d268 3
d272 7
d285 1
a286 3
#ifdef RTLD
	iflush(sp, sizeof(jmpslot_t));
#endif	/* RTLD */
@


1.7
log
@Back out change to md_make_gotreloc which added 4 arguement of got_t *.
Add argument to md_fix_jmpslot indicating whether this the first (i.e
tranfer) jmpslot or not.  Add better support for VAX (the VAX can support
pure text code; let ld that advantage of it).  Checking in verified and
working versions of rtld VAX support routines.
@
text
@d1 1
a1 1
/*	$NetBSD: md.c,v 1.6 1998/08/26 14:37:40 matt Exp $	*/
d254 1
a254 5
#ifdef RTLD
	if ((void *)addr == binder_entry) {
#else
	if (offset == 0) {
#endif
@


1.6
log
@Add external symbol for __PROCEDURE_LINKAGE_TABLE_.  Modify arguments
to md_make_gotreloc for VAX'es sake.
@
text
@d1 1
a1 1
/*	$NetBSD: md.c,v 1.5 1998/08/05 04:25:03 mycroft Exp $	*/
d232 1
a232 1
md_fix_jmpslot(sp, offset, addr)
d236 1
d297 1
a297 1
md_make_gotreloc(rp, r, type, gotp)
a299 1
got_t			*gotp;
@


1.5
log
@More cruft.
@
text
@d1 1
a1 1
/*	$NetBSD: md.c,v 1.4 1998/08/05 04:21:51 mycroft Exp $	*/
d296 1
a296 1
md_make_gotreloc(rp, r, type)
d299 1
@


1.4
log
@GC some cruft.
@
text
@d1 1
a1 1
/*	$NetBSD: md.c,v 1.3 1997/10/17 21:25:49 mark Exp $	*/
d164 1
a164 1
			 | ((relocation&0x3ffffff) >> 2));
a251 9
	 *
	 * For other jump slots generated (fixed by ld.so)
	 * just modify the address offset since the slot
	 * will have been created with md_make_jmpslot().
	 * i.e.
	 *	ldr	ip, [pc]
	 *	add	pc, pc, ip
	 *	.word	new_rel_addr
	 *	<unused>
d389 1
@


1.3
log
@Add support for PIC code.
Add support for ld.so
@
text
@d1 1
a1 1
/*	$NetBSD: md.c,v 1.2 1996/08/21 18:43:29 mark Exp $	*/
a129 3
#ifdef HACK
static struct relocation_info *rrs_reloc; /* HACK HACK HACK		XXX */
#endif
a147 8
#ifdef HACK
	if (rp == rrs_reloc	/* HACK HACK HACK			XXX */
	    || (RELOC_PCREL_P(rp) && relocatable_output)) {
		rrs_reloc = NULL;
		return;
	}
	rrs_reloc = NULL;
#endif
d161 1
a161 4
	case 3: {
		int a;
		a = (get_long(addr)&0xff000000)
			 | ((relocation&0x3ffffff) >> 2);
a165 1
		}
a181 4
#ifdef HACK
	if (type == RELTYPE_EXTERN)
		rrs_reloc = rp;	/* HACK HACK HACK			XXX */
#endif
a270 3
#ifdef RTLD
		iflush(sp, sizeof(jmpslot_t));
#endif	/* RTLD */
a271 8
#ifdef RTLD
		/*
		 * Change the relative offset to the binder
		 * into a relative offset to the function
		 */
		sp->address = (addr - (long)sp - 12);
/*		iflush(sp, sizeof(jmpslot_t));*/
#else
d278 3
a281 1
	}
@


1.2
log
@Fixed NetBSD tag.
@
text
@d1 1
a1 1
/* $NetBSD$ */
d4 2
d19 1
d36 1
a36 1
/* First cut for arm32 (currently a simple copy of i386 code) */
d47 4
d54 27
d104 15
a118 1
		rel -= rp->r_address; /* really?			XXX */
d130 3
a132 2
static struct relocation_info *rrs_reloc; /* HACK HACK HACK			XXX */

d140 12
d158 1
a158 1
	
d172 4
a175 1
	case 3:
d180 1
d197 1
d200 1
a200 1
	
d223 11
a233 4
	u_long	fudge = - (offset + 12);

	sp->opcode1 = SAVEPC;
	sp->opcode2 = CALL | ((fudge >> 2) & 0xffffff);
d235 3
d245 5
d257 10
a266 1
	 * Generate the following sequence:
d268 12
a279 1
	 *	.word	addr
d281 29
a309 2
	sp->opcode1 = JUMP;
	sp->reloc_index = addr;
d343 1
d368 3
d390 1
a390 1
#endif /* RTLD */
d418 24
d451 1
d462 11
d484 6
d500 1
a502 14

void
md_swapout_jmpslot(j, n)
jmpslot_t	*j;
int		n;
{
	for (; n; n--, j++) {
		j->opcode1 = md_swap_long(j->opcode1);
		j->opcode2 = md_swap_long(j->opcode2);
		j->reloc_index = md_swap_long(j->reloc_index);
	}
}

#endif /* NEED_SWAP */
@


1.1
log
@Initial commit of arm32 machine dependant code for ld.
Currently only supports static linking.
@
text
@d1 1
a1 1
/* $NetBSD */
@
