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

📄 ia64-lite.patch

📁 Linux-2.6.18内核调试工具补丁程序KGDB。
💻 PATCH
📖 第 1 页 / 共 4 页
字号:
This is support of the IA64 arch for KGDB, and is primarily the work ofBob Picco.Signed-off-by: Milind Dumbare <milind@linsyssoft.com> arch/ia64/kernel/Makefile   |    1 arch/ia64/kernel/entry.S    |    4 arch/ia64/kernel/ivt.S      |   16 arch/ia64/kernel/kgdb-jmp.S |  238 +++++++++ arch/ia64/kernel/kgdb.c     | 1131 ++++++++++++++++++++++++++++++++++++++++++++ arch/ia64/kernel/process.c  |    6 arch/ia64/kernel/smp.c      |   17 arch/ia64/kernel/traps.c    |    6 arch/ia64/kernel/unwind.c   |   87 +++ arch/ia64/mm/extable.c      |    6 arch/ia64/mm/fault.c        |    4 include/asm-ia64/kdebug.h   |    1 include/asm-ia64/kgdb.h     |   36 + lib/Kconfig.debug           |    2 14 files changed, 1551 insertions(+), 4 deletions(-)Index: linux-2.6.14-5-new-remove_all/arch/ia64/mm/extable.c===================================================================--- linux-2.6.14-5-new-remove_all.orig/arch/ia64/mm/extable.c	2006-02-02 09:03:12.000000000 +0530+++ linux-2.6.14-5-new-remove_all/arch/ia64/mm/extable.c	2006-02-02 09:08:07.000000000 +0530@@ -7,6 +7,7 @@  #include <linux/config.h> #include <linux/sort.h>+#include <linux/kgdb.h>  #include <asm/uaccess.h> #include <asm/module.h>@@ -74,6 +75,11 @@                 else                         last = mid - 1;         }+#ifdef CONFIG_KGDB+	if (atomic_read(&debugger_active) && kgdb_may_fault)+		kgdb_fault_longjmp(kgdb_fault_jmp_regs);+		/* Not reached. */+#endif         return NULL; } Index: linux-2.6.14-5-new-remove_all/arch/ia64/mm/fault.c===================================================================--- linux-2.6.14-5-new-remove_all.orig/arch/ia64/mm/fault.c	2006-02-02 09:03:12.000000000 +0530+++ linux-2.6.14-5-new-remove_all/arch/ia64/mm/fault.c	2006-02-02 09:08:07.000000000 +0530@@ -229,6 +229,10 @@ 	 */ 	bust_spinlocks(1); +	if (notify_die(DIE_PAGE_FAULT_NO_CONTEXT, "no context", regs,+			isr, 14, SIGSEGV) == NOTIFY_STOP)+		return;+ 	if (address < PAGE_SIZE) 		printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference (address %016lx)\n", address); 	elseIndex: linux-2.6.14-5-new-remove_all/arch/ia64/kernel/kgdb-jmp.S===================================================================--- /dev/null	1970-01-01 00:00:00.000000000 +0000+++ linux-2.6.14-5-new-remove_all/arch/ia64/kernel/kgdb-jmp.S	2006-02-02 09:08:07.000000000 +0530@@ -0,0 +1,238 @@+/* setjmp() and longjmp() assembler support for kdb on ia64.++   This code was copied from glibc CVS as of 2001-06-27 and modified where+   necessary to fit the kernel.+   Keith Owens <kaos@melbourne.sgi.com> 2001-06-27+ */++/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.+   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.++   The GNU C Library is free software; you can redistribute it and/or+   modify it under the terms of the GNU Library General Public License as+   published by the Free Software Foundation; either version 2 of the+   License, or (at your option) any later version.++   The GNU C Library 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+   Library General Public License for more details.++   You should have received a copy of the GNU Library General Public+   License along with the GNU C Library; see the file COPYING.LIB.  If+   not, write to the Free Software Foundation, Inc.,+   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.+*/++#include <asm/asmmacro.h>+GLOBAL_ENTRY(kgdb_fault_setjmp)+	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)+	alloc loc1=ar.pfs,2,2,2,0+	mov r16=ar.unat+	;;+	mov r17=ar.fpsr+	mov r2=in0+	add r3=8,in0+	;;+.mem.offset 0,0;+	st8.spill.nta [r2]=sp,16	// r12 (sp)+.mem.offset 8,0;+	st8.spill.nta [r3]=gp,16	// r1 (gp)+	;;+	st8.nta [r2]=r16,16		// save caller's unat+	st8.nta [r3]=r17,16		// save fpsr+	add r8=0xa0,in0+	;;+.mem.offset 160,0;+	st8.spill.nta [r2]=r4,16	// r4+.mem.offset 168,0;+	st8.spill.nta [r3]=r5,16	// r5+	add r9=0xb0,in0+	;;+	stf.spill.nta [r8]=f2,32+	stf.spill.nta [r9]=f3,32+	mov loc0=rp+	.body+	;;+	stf.spill.nta [r8]=f4,32+	stf.spill.nta [r9]=f5,32+	mov r17=b1+	;;+	stf.spill.nta [r8]=f16,32+	stf.spill.nta [r9]=f17,32+	mov r18=b2+	;;+	stf.spill.nta [r8]=f18,32+	stf.spill.nta [r9]=f19,32+	mov r19=b3+	;;+	stf.spill.nta [r8]=f20,32+	stf.spill.nta [r9]=f21,32+	mov r20=b4+	;;+	stf.spill.nta [r8]=f22,32+	stf.spill.nta [r9]=f23,32+	mov r21=b5+	;;+	stf.spill.nta [r8]=f24,32+	stf.spill.nta [r9]=f25,32+	mov r22=ar.lc+	;;+	stf.spill.nta [r8]=f26,32+	stf.spill.nta [r9]=f27,32+	mov r24=pr+	;;+	stf.spill.nta [r8]=f28,32+	stf.spill.nta [r9]=f29,32+	;;+	stf.spill.nta [r8]=f30+	stf.spill.nta [r9]=f31++.mem.offset 0,0;+	st8.spill.nta [r2]=r6,16	// r6+.mem.offset 8,0;+	st8.spill.nta [r3]=r7,16	// r7+	;;+	mov r23=ar.bsp+	mov r25=ar.unat+	st8.nta [r2]=loc0,16		// b0+	st8.nta [r3]=r17,16		// b1+	;;+	st8.nta [r2]=r18,16		// b2+	st8.nta [r3]=r19,16		// b3+	;;+	st8.nta [r2]=r20,16		// b4+	st8.nta [r3]=r21,16		// b5+	;;+	st8.nta [r2]=loc1,16		// ar.pfs+	st8.nta [r3]=r22,16		// ar.lc+	;;+	st8.nta [r2]=r24,16		// pr+	st8.nta [r3]=r23,16		// ar.bsp+	;;+	st8.nta [r2]=r25		// ar.unat+	st8.nta [r3]=in0		// &__jmp_buf+	mov r8=0+	mov rp=loc0+	mov ar.pfs=loc1+	br.ret.sptk.few rp+END(kdba_setjmp)+#define	pPos	p6	/* is rotate count positive? */+#define	pNeg	p7	/* is rotate count negative? */+GLOBAL_ENTRY(kgdb_fault_longjmp)+	alloc r8=ar.pfs,2,1,0,0+	mov r27=ar.rsc+	add r2=0x98,in0		// r2 <- &jmpbuf.orig_jmp_buf_addr+	;;+	ld8 r8=[r2],-16		// r8 <- orig_jmp_buf_addr+	mov r10=ar.bsp+	and r11=~0x3,r27	// clear ar.rsc.mode+	;;+	flushrs			// flush dirty regs to backing store (must be first in insn grp)+	ld8 r23=[r2],8		// r23 <- jmpbuf.ar_bsp+	sub r8=r8,in0		// r8 <- &orig_jmpbuf - &jmpbuf+	;;+	ld8 r25=[r2]		// r25 <- jmpbuf.ar_unat+	extr.u r8=r8,3,6	// r8 <- (&orig_jmpbuf - &jmpbuf)/8 & 0x3f+	;;+	cmp.lt pNeg,pPos=r8,r0+	mov r2=in0+	;;+(pPos)	mov r16=r8+(pNeg)	add r16=64,r8+(pPos)	sub r17=64,r8+(pNeg)	sub r17=r0,r8+	;;+	mov ar.rsc=r11		// put RSE in enforced lazy mode+	shr.u r8=r25,r16+	add r3=8,in0		// r3 <- &jmpbuf.r1+	shl r9=r25,r17+	;;+	or r25=r8,r9+	;;+	mov r26=ar.rnat+	mov ar.unat=r25		// setup ar.unat (NaT bits for r1, r4-r7, and r12)+	;;+	ld8.fill.nta sp=[r2],16	// r12 (sp)+	ld8.fill.nta gp=[r3],16		// r1 (gp)+	dep r11=-1,r23,3,6	// r11 <- ia64_rse_rnat_addr(jmpbuf.ar_bsp)+	;;+	ld8.nta r16=[r2],16		// caller's unat+	ld8.nta r17=[r3],16		// fpsr+	;;+	ld8.fill.nta r4=[r2],16	// r4+	ld8.fill.nta r5=[r3],16		// r5 (gp)+	cmp.geu p8,p0=r10,r11	// p8 <- (ar.bsp >= jmpbuf.ar_bsp)+	;;+	ld8.fill.nta r6=[r2],16	// r6+	ld8.fill.nta r7=[r3],16		// r7+	;;+	mov ar.unat=r16			// restore caller's unat+	mov ar.fpsr=r17			// restore fpsr+	;;+	ld8.nta r16=[r2],16		// b0+	ld8.nta r17=[r3],16		// b1+	;;+(p8)	ld8 r26=[r11]		// r26 <- *ia64_rse_rnat_addr(jmpbuf.ar_bsp)+	mov ar.bspstore=r23	// restore ar.bspstore+	;;+	ld8.nta r18=[r2],16		// b2+	ld8.nta r19=[r3],16		// b3+	;;+	ld8.nta r20=[r2],16		// b4+	ld8.nta r21=[r3],16		// b5+	;;+	ld8.nta r11=[r2],16		// ar.pfs+	ld8.nta r22=[r3],56		// ar.lc+	;;+	ld8.nta r24=[r2],32		// pr+	mov b0=r16+	;;+	ldf.fill.nta f2=[r2],32+	ldf.fill.nta f3=[r3],32+	mov b1=r17+	;;+	ldf.fill.nta f4=[r2],32+	ldf.fill.nta f5=[r3],32+	mov b2=r18+	;;+	ldf.fill.nta f16=[r2],32+	ldf.fill.nta f17=[r3],32+	mov b3=r19+	;;+	ldf.fill.nta f18=[r2],32+	ldf.fill.nta f19=[r3],32+	mov b4=r20+	;;+	ldf.fill.nta f20=[r2],32+	ldf.fill.nta f21=[r3],32+	mov b5=r21+	;;+	ldf.fill.nta f22=[r2],32+	ldf.fill.nta f23=[r3],32+	mov ar.lc=r22+	;;+	ldf.fill.nta f24=[r2],32+	ldf.fill.nta f25=[r3],32+	cmp.eq p8,p9=0,in1+	;;+	ldf.fill.nta f26=[r2],32+	ldf.fill.nta f27=[r3],32+	mov ar.pfs=r11+	;;+	ldf.fill.nta f28=[r2],32+	ldf.fill.nta f29=[r3],32+	;;+	ldf.fill.nta f30=[r2]+	ldf.fill.nta f31=[r3]+(p8)	mov r8=1++	mov ar.rnat=r26		// restore ar.rnat+	;;+	mov ar.rsc=r27		// restore ar.rsc+(p9)	mov r8=in1++	invala			// virt. -> phys. regnum mapping may change+	mov pr=r24,-1+	br.ret.sptk.few rp+END(kgdb_fault_longjmp)Index: linux-2.6.14-5-new-remove_all/arch/ia64/kernel/kgdb.c===================================================================--- /dev/null	1970-01-01 00:00:00.000000000 +0000+++ linux-2.6.14-5-new-remove_all/arch/ia64/kernel/kgdb.c	2006-02-02 09:10:36.000000000 +0530@@ -0,0 +1,1131 @@+/*+ *+ * This program 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.+ *+ * This program 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.+ *+ */++/*+ * Copyright (C) 2000-2001 VERITAS Software Corporation.+ * (c) Copyright 2005 Hewlett-Packard Development Company, L.P.+ *     Bob Picco <bob.picco@hp.com>+ */+/*+ *  Contributor:     Lake Stevens Instrument Division$+ *  Written by:      Glenn Engel $+ *  Updated by:	     Amit Kale<akale@veritas.com>+ *  Modified for 386 by Jim Kingdon, Cygnus Support.+ *  Origianl kgdb, compatibility with 2.1.xx kernel by David Grothe <dave@gcom.com>+ */++#include <linux/string.h>+#include <linux/kernel.h>+#include <linux/sched.h>+#include <linux/smp.h>+#include <linux/spinlock.h>+#include <linux/delay.h>+#include <asm/system.h>+#include <asm/ptrace.h>		/* for linux pt_regs struct */+#include <asm/unwind.h>+#include <asm/rse.h>+#include <linux/kgdb.h>+#include <linux/init.h>+#include <asm/cacheflush.h>+#include <asm/kdebug.h>++#define NUM_REGS 590+#define REGISTER_BYTES (NUM_REGS*8+128*8)+#define REGISTER_BYTE(N) (((N) * 8)                                    \+	+ ((N) <= IA64_FR0_REGNUM ?                                     \+	0 : 8 * (((N) > IA64_FR127_REGNUM) ? 128 : (N) - IA64_FR0_REGNUM)))+#define REGISTER_SIZE(N)                                               \+	(((N) >= IA64_FR0_REGNUM && (N) <= IA64_FR127_REGNUM) ? 16 : 8)+#define IA64_GR0_REGNUM         0+#define IA64_FR0_REGNUM         128+#define IA64_FR127_REGNUM       (IA64_FR0_REGNUM+127)+#define IA64_PR0_REGNUM         256+#define IA64_BR0_REGNUM         320+#define IA64_VFP_REGNUM         328+#define IA64_PR_REGNUM          330+#define IA64_IP_REGNUM          331+#define IA64_PSR_REGNUM         332+#define IA64_CFM_REGNUM         333+#define IA64_AR0_REGNUM         334+#define IA64_NAT0_REGNUM        462+#define IA64_NAT31_REGNUM       (IA64_NAT0_REGNUM+31)+#define IA64_NAT32_REGNUM       (IA64_NAT0_REGNUM+32)+#define IA64_RSC_REGNUM		(IA64_AR0_REGNUM+16)+#define IA64_BSP_REGNUM		(IA64_AR0_REGNUM+17)+#define IA64_BSPSTORE_REGNUM	(IA64_AR0_REGNUM+18)+#define IA64_RNAT_REGNUM	(IA64_AR0_REGNUM+19)+#define IA64_FCR_REGNUM		(IA64_AR0_REGNUM+21)+#define IA64_EFLAG_REGNUM	(IA64_AR0_REGNUM+24)+#define IA64_CSD_REGNUM		(IA64_AR0_REGNUM+25)+#define IA64_SSD_REGNUM		(IA64_AR0_REGNUM+26)+#define IA64_CFLG_REGNUM	(IA64_AR0_REGNUM+27)+#define IA64_FSR_REGNUM		(IA64_AR0_REGNUM+28)+#define IA64_FIR_REGNUM		(IA64_AR0_REGNUM+29)+#define IA64_FDR_REGNUM		(IA64_AR0_REGNUM+30)+#define IA64_CCV_REGNUM		(IA64_AR0_REGNUM+32)+#define IA64_UNAT_REGNUM	(IA64_AR0_REGNUM+36)+#define IA64_FPSR_REGNUM	(IA64_AR0_REGNUM+40)+#define IA64_ITC_REGNUM		(IA64_AR0_REGNUM+44)+#define IA64_PFS_REGNUM		(IA64_AR0_REGNUM+64)+#define IA64_LC_REGNUM		(IA64_AR0_REGNUM+65)+#define IA64_EC_REGNUM		(IA64_AR0_REGNUM+66)++#define	REGISTER_INDEX(N)	(REGISTER_BYTE(N) / sizeof (unsigned long))+#define BREAK_INSTR_ALIGN	(~0xfULL)++#define	ptoff(V)	((unsigned int) &((struct pt_regs *)0x0)->V)+struct reg_to_ptreg_index {+	unsigned int reg;+	unsigned int ptregoff;+};++static struct reg_to_ptreg_index gr_reg_to_ptreg_index[] = {+	{IA64_GR0_REGNUM + 1, ptoff(r1)},+	{IA64_GR0_REGNUM + 2, ptoff(r2)},+	{IA64_GR0_REGNUM + 3, ptoff(r3)},+	{IA64_GR0_REGNUM + 8, ptoff(r8)},+	{IA64_GR0_REGNUM + 9, ptoff(r9)},+	{IA64_GR0_REGNUM + 10, ptoff(r10)},+	{IA64_GR0_REGNUM + 11, ptoff(r11)},+	{IA64_GR0_REGNUM + 12, ptoff(r12)},+	{IA64_GR0_REGNUM + 13, ptoff(r13)},+	{IA64_GR0_REGNUM + 14, ptoff(r14)},+	{IA64_GR0_REGNUM + 15, ptoff(r15)},+	{IA64_GR0_REGNUM + 16, ptoff(r16)},+	{IA64_GR0_REGNUM + 17, ptoff(r17)},+	{IA64_GR0_REGNUM + 18, ptoff(r18)},+	{IA64_GR0_REGNUM + 19, ptoff(r19)},+	{IA64_GR0_REGNUM + 20, ptoff(r20)},+	{IA64_GR0_REGNUM + 21, ptoff(r21)},+	{IA64_GR0_REGNUM + 22, ptoff(r22)},+	{IA64_GR0_REGNUM + 23, ptoff(r23)},+	{IA64_GR0_REGNUM + 24, ptoff(r24)},+	{IA64_GR0_REGNUM + 25, ptoff(r25)},+	{IA64_GR0_REGNUM + 26, ptoff(r26)},+	{IA64_GR0_REGNUM + 27, ptoff(r27)},+	{IA64_GR0_REGNUM + 28, ptoff(r28)},+	{IA64_GR0_REGNUM + 29, ptoff(r29)},+	{IA64_GR0_REGNUM + 30, ptoff(r30)},+	{IA64_GR0_REGNUM + 31, ptoff(r31)},+};++static struct reg_to_ptreg_index br_reg_to_ptreg_index[] = {+	{IA64_BR0_REGNUM, ptoff(b0)},+	{IA64_BR0_REGNUM + 6, ptoff(b6)},+	{IA64_BR0_REGNUM + 7, ptoff(b7)},+};++static struct reg_to_ptreg_index ar_reg_to_ptreg_index[] = {+	{IA64_PFS_REGNUM, ptoff(ar_pfs)},+	{IA64_UNAT_REGNUM, ptoff(ar_unat)},+	{IA64_RNAT_REGNUM, ptoff(ar_rnat)},+	{IA64_BSPSTORE_REGNUM, ptoff(ar_bspstore)},+	{IA64_RSC_REGNUM, ptoff(ar_rsc)},+	{IA64_CSD_REGNUM, ptoff(ar_csd)},+	{IA64_SSD_REGNUM, ptoff(ar_ssd)},+	{IA64_FPSR_REGNUM, ptoff(ar_fpsr)},+	{IA64_CCV_REGNUM, ptoff(ar_ccv)},+};++extern atomic_t cpu_doing_single_step;++static int kgdb_gr_reg(int regnum, struct unw_frame_info *info,+	unsigned long *reg, int rw)+{+	char nat;+

⌨️ 快捷键说明

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