📄 ia64-lite.patch
字号:
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 + -