⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reloc.s

📁 网卡 BOOT ROM 的 64 住源程序。模块有:核心代码、H文件、网卡驱动程序、头代码文件。
💻 S
字号:
/* reloc.S - position independent IA-64 ELF shared object relocator   Copyright (C) 1999 Hewlett-Packard Co.	Contributed by David Mosberger <davidm@hpl.hp.com>.   Copyright (C) 2002 Eric Biederman sponsored by Linux Networx   This file is part of etherboot.   This file was derived from reloc_ia64.S from GNU-EFI, the GNU EFI development environment.   GNU EFI is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2, or (at your option)   any later version.   GNU EFI is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with GNU EFI; see the file COPYING.  If not, write to the Free   Software Foundation, 59 Temple Place - Suite 330, Boston, MA   02111-1307, USA. *//* * This is written in assembly because the entire code needs to be position * independent.  Note that the compiler does not generate code that's position * independent by itself because it relies on the global offset table being * relocated. * * This code assumes the code was compiled with -mconstant-gp -mauto-pic -static -shared * Which generates position independent code, but not position indepedent data. * This code assumes in the linker script the rela entries are bracked with: * _rela, _erela and _rela_size gives the total size of the rela entries. * This gives a much smaller binary than when compiled as a true shared object. * * This code assumes the original shared object was initially relocated, * So that it only needs to apply changes for the new address the code is linked * at. */	.text	.psr abi64	.psr lsb	.lsb#define ST_VALUE_OFF	8		/* offset of st_value in elf sym */#define RET_SUCCESS		0#define RET_LOAD_ERROR		1#define R_IA64_NONE		0#define R_IA64_REL64MSB		0x6e#define R_IA64_REL64LSB		0x6f#define R_IA64_DIR64MSB		0x26#define R_IA64_DIR64LSB		0x27#define R_IA64_FPTR64MSB	0x46#define R_IA64_FPTR64LSB	0x47#define	delta	in0	/* Chaing in load address (address of .text) */#define ldbase	r15#define target  r16#define val	r17#define rela	r18#define relasz  r19#define relaent	r20#define addr	r21#define r_info	r22#define r_offset r23#define r_type	r25#define Pmore		p6#define Pnone		p6#define Prel		p7#define Pdir		p8	.global _relocate_relocate:	alloc		r2=ar.pfs,1,0,0,0	add		rela=@gprel(_rela),gp	add		ldbase=@gprel(_text),gp	add		r3=@ltoff(_rela_size),gp	;;	ld8		relasz = [r3]	mov		relaent=24	br.sptk.few	apply_relocsapply_loop:	ld8		r_offset = [rela]	add		addr = 8,rela	sub		relasz = relasz,relaent		;;	ld8		r_info = [addr], 8	;; 	add		target = ldbase, r_offset	add		rela = rela,relaent	extr.u		r_type = r_info, 0, 32	;;	cmp.eq		Pnone,p0 = R_IA64_NONE, r_type	cmp.eq		Prel,p0  = R_IA64_REL64LSB, r_type	cmp.eq		Pdir,p0  = R_IA64_DIR64LSB, r_type /* Needed? */	;;(Pnone) br.cond.sptk.few apply_relocs(Prel)	br.cond.sptk.few apply_REL64(Pdir)  br.cond.sptk.few apply_DIR64 /* Needed? */	;; apply_error:	mov		r8 = RET_LOAD_ERROR	br.ret.sptk.few	rpapply_REL64:apply_DIR64:	ld8		val = [target]	;;	add		val = val, delta	;;	st8		[target] = val	;; 	/* fall through to apply_relocs */apply_relocs:	cmp.ltu		Pmore,p0=0,relasz(Pmore) br.cond.sptk.few	apply_loop	;; 	mov		r8 = RET_SUCCESS	br.ret.sptk.few	rp		.size	_relocate, . - _relocate	.endp _relocate

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -