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

📄 x86_64-lite.patch

📁 Linux-2.6.18内核调试工具补丁程序KGDB。
💻 PATCH
📖 第 1 页 / 共 2 页
字号:
This adds support for the x86_64 architecture.  In addition to what was notedin the core-lite patch about stuff outside of new files, we add -g0 tocompiling of syscalls.o as otherwise we run into problems when debuggingmodules, and like i386 annotate switch_to().Signed-off-by: Milind Dumbare <milind@linsyssoft.com>arch/x86_64/Kconfig.debug     |    3 arch/x86_64/kernel/Makefile   |    1 arch/x86_64/kernel/kgdb-jmp.S |   65 +++++ arch/x86_64/kernel/kgdb.c     |  474 ++++++++++++++++++++++++++++++++++++++++++ include/asm-x86_64/kgdb.h     |   50 ++++ include/asm-x86_64/system.h   |    6 include/linux/kgdb.h          |    4 kernel/kgdb.c                 |   14 + lib/Kconfig.debug             |    2 9 files changed, 613 insertions(+), 6 deletions(-)Index: linux-2.6.15-rc6-x86_64/arch/x86_64/Kconfig.debug===================================================================--- linux-2.6.15-rc6-x86_64.orig/arch/x86_64/Kconfig.debug	2005-12-21 10:09:55.000000000 +0530+++ linux-2.6.15-rc6-x86_64/arch/x86_64/Kconfig.debug	2005-12-26 14:01:58.318765792 +0530@@ -32,7 +32,4 @@          Add a simple leak tracer to the IOMMU code. This is useful when you 	 are debugging a buggy device driver that leaks IOMMU mappings. -#config X86_REMOTE_DEBUG-#       bool "kgdb debugging stub"- endmenuIndex: linux-2.6.15-rc6-x86_64/arch/x86_64/kernel/kgdb-jmp.S===================================================================--- linux-2.6.15-rc6-x86_64.orig/arch/x86_64/kernel/kgdb-jmp.S	2005-12-26 12:14:53.973528792 +0530+++ linux-2.6.15-rc6-x86_64/arch/x86_64/kernel/kgdb-jmp.S	2005-12-26 14:01:58.320765488 +0530@@ -0,0 +1,65 @@+/*+ * arch/x86_64/kernel/kgdb-jmp.S+ *+ * Save and restore system registers so that within a limited frame we+ * may have a fault and "jump back" to a known safe location.+ *+ * Author: Tom Rini <trini@kernel.crashing.org>+ *+ * Cribbed from glibc, which carries the following:+ * Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.+ * Copyright (C) 2005 by MontaVista Software.+ *+ * This file is licensed under the terms of the GNU General Public License+ * version 2. This program as licensed "as is" without any warranty of+ * any kind, whether express or implied.+ */++#include <linux/linkage.h>++#define JB_RBX		0+#define JB_RBP		1+#define JB_R12		2+#define JB_R13		3+#define JB_R14		4+#define JB_R15		5+#define JB_RSP		6+#define JB_PC		7++	.code64++/* This must be called prior to kgdb_fault_longjmp and+ * kgdb_fault_longjmp must not be called outside of the context of the+ * last call to kgdb_fault_setjmp.+ */+ENTRY(kgdb_fault_setjmp)+	/* Save registers. */+	movq %rbx, (JB_RBX*8)(%rdi)+	movq %rbp, (JB_RBP*8)(%rdi)+	movq %r12, (JB_R12*8)(%rdi)+	movq %r13, (JB_R13*8)(%rdi)+	movq %r14, (JB_R14*8)(%rdi)+	movq %r15, (JB_R15*8)(%rdi)+	leaq 8(%rsp), %rdx	/* Save SP as it will be after we return. */+	movq %rdx, (JB_RSP*8)(%rdi)+	movq (%rsp), %rax	/* Save PC we are returning to now. */+	movq %rax, (JB_PC*8)(%rdi)+	/* Set return value for setjmp. */+	mov $0,%eax+	movq (JB_PC*8)(%rdi),%rdx+	movq (JB_RSP*8)(%rdi),%rsp+	jmpq *%rdx++ENTRY(kgdb_fault_longjmp)+	/* Restore registers. */+	movq (JB_RBX*8)(%rdi),%rbx+	movq (JB_RBP*8)(%rdi),%rbp+	movq (JB_R12*8)(%rdi),%r12+	movq (JB_R13*8)(%rdi),%r13+	movq (JB_R14*8)(%rdi),%r14+	movq (JB_R15*8)(%rdi),%r15+	/* Set return value for setjmp. */+	movq (JB_PC*8)(%rdi),%rdx+	movq (JB_RSP*8)(%rdi),%rsp+	mov $1,%eax+	jmpq *%rdxIndex: linux-2.6.15-rc6-x86_64/arch/x86_64/kernel/kgdb.c===================================================================--- linux-2.6.15-rc6-x86_64.orig/arch/x86_64/kernel/kgdb.c	2005-12-26 12:14:53.973528792 +0530+++ linux-2.6.15-rc6-x86_64/arch/x86_64/kernel/kgdb.c	2005-12-26 14:03:37.529683440 +0530@@ -0,0 +1,474 @@+/*+ *+ * 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) 2004 Amit S. Kale <amitkale@linsyssoft.com>+ * Copyright (C) 2000-2001 VERITAS Software Corporation.+ * Copyright (C) 2002 Andi Kleen, SuSE Labs+ * Copyright (C) 2004 LinSysSoft Technologies Pvt. Ltd.+ */+/****************************************************************************+ *  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>+ *  Integrated into 2.2.5 kernel by Tigran Aivazian <tigran@sco.com>+ *  X86_64 changes from Andi Kleen's patch merged by Jim Houston+ */++#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 <linux/kgdb.h>+#include <linux/init.h>+#include <asm/apicdef.h>+#include <asm/mach_apic.h>+#include <asm/kdebug.h>+#include <asm/debugreg.h>++/* Put the error code here just in case the user cares.  */+int gdb_x86_64errcode;+/* Likewise, the vector number here (since GDB only gets the signal+   number through the usual means, and that's not very specific).  */+int gdb_x86_64vector = -1;++extern atomic_t cpu_doing_single_step;++void regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs)+{+	gdb_regs[_RAX] = regs->rax;+	gdb_regs[_RBX] = regs->rbx;+	gdb_regs[_RCX] = regs->rcx;+	gdb_regs[_RDX] = regs->rdx;+	gdb_regs[_RSI] = regs->rsi;+	gdb_regs[_RDI] = regs->rdi;+	gdb_regs[_RBP] = regs->rbp;+	gdb_regs[_PS] = regs->eflags;+	gdb_regs[_PC] = regs->rip;+	gdb_regs[_R8] = regs->r8;+	gdb_regs[_R9] = regs->r9;+	gdb_regs[_R10] = regs->r10;+	gdb_regs[_R11] = regs->r11;+	gdb_regs[_R12] = regs->r12;+	gdb_regs[_R13] = regs->r13;+	gdb_regs[_R14] = regs->r14;+	gdb_regs[_R15] = regs->r15;+	gdb_regs[_RSP] = regs->rsp;+}++extern void thread_return(void);+void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)+{+	gdb_regs[_RAX] = 0;+	gdb_regs[_RBX] = 0;+	gdb_regs[_RCX] = 0;+	gdb_regs[_RDX] = 0;+	gdb_regs[_RSI] = 0;+	gdb_regs[_RDI] = 0;+	gdb_regs[_RBP] = *(unsigned long *)p->thread.rsp;+	gdb_regs[_PS] = *(unsigned long *)(p->thread.rsp + 8);+	gdb_regs[_PC] = (unsigned long)&thread_return;+	gdb_regs[_R8] = 0;+	gdb_regs[_R9] = 0;+	gdb_regs[_R10] = 0;+	gdb_regs[_R11] = 0;+	gdb_regs[_R12] = 0;+	gdb_regs[_R13] = 0;+	gdb_regs[_R14] = 0;+	gdb_regs[_R15] = 0;+	gdb_regs[_RSP] = p->thread.rsp;+}++void gdb_regs_to_regs(unsigned long *gdb_regs, struct pt_regs *regs)+{+	regs->rax = gdb_regs[_RAX];+	regs->rbx = gdb_regs[_RBX];+	regs->rcx = gdb_regs[_RCX];+	regs->rdx = gdb_regs[_RDX];+	regs->rsi = gdb_regs[_RSI];+	regs->rdi = gdb_regs[_RDI];+	regs->rbp = gdb_regs[_RBP];+	regs->eflags = gdb_regs[_PS];+	regs->rip = gdb_regs[_PC];+	regs->r8 = gdb_regs[_R8];+	regs->r9 = gdb_regs[_R9];+	regs->r10 = gdb_regs[_R10];+	regs->r11 = gdb_regs[_R11];+	regs->r12 = gdb_regs[_R12];+	regs->r13 = gdb_regs[_R13];+	regs->r14 = gdb_regs[_R14];+	regs->r15 = gdb_regs[_R15];+#if 0				/* can't change these */+	regs->rsp = gdb_regs[_RSP];+	regs->ss = gdb_regs[_SS];+	regs->fs = gdb_regs[_FS];+	regs->gs = gdb_regs[_GS];+#endif++}				/* gdb_regs_to_regs */++struct hw_breakpoint {+	unsigned enabled;+	unsigned type;+	unsigned len;+	unsigned long addr;+} breakinfo[4] = { {+enabled:0}, {+enabled:0}, {+enabled:0}, {+enabled:0}};++void kgdb_correct_hw_break(void)+{+	int breakno;+	int correctit;+	int breakbit;+	unsigned long dr7;++	asm volatile ("movq %%db7, %0\n":"=r" (dr7):);+	do {+		unsigned long addr0, addr1, addr2, addr3;+		asm volatile ("movq %%db0, %0\n"+			      "movq %%db1, %1\n"+			      "movq %%db2, %2\n"+			      "movq %%db3, %3\n":"=r" (addr0), "=r"(addr1),+			      "=r"(addr2), "=r"(addr3):);+	} while (0);+	correctit = 0;+	for (breakno = 0; breakno < 3; breakno++) {+		breakbit = 2 << (breakno << 1);+		if (!(dr7 & breakbit) && breakinfo[breakno].enabled) {+			correctit = 1;+			dr7 |= breakbit;+			dr7 &= ~(0xf0000 << (breakno << 2));+			dr7 |= (((breakinfo[breakno].len << 2) |+				 breakinfo[breakno].type) << 16) <<+			    (breakno << 2);+			switch (breakno) {+			case 0:+				asm volatile ("movq %0, %%dr0\n"::"r"+					      (breakinfo[breakno].addr));+				break;++			case 1:+				asm volatile ("movq %0, %%dr1\n"::"r"+					      (breakinfo[breakno].addr));+				break;++			case 2:+				asm volatile ("movq %0, %%dr2\n"::"r"+					      (breakinfo[breakno].addr));+				break;++			case 3:+				asm volatile ("movq %0, %%dr3\n"::"r"+					      (breakinfo[breakno].addr));+				break;+			}+		} else if ((dr7 & breakbit) && !breakinfo[breakno].enabled) {+			correctit = 1;+			dr7 &= ~breakbit;+			dr7 &= ~(0xf0000 << (breakno << 2));+		}+	}+	if (correctit) {+		asm volatile ("movq %0, %%db7\n"::"r" (dr7));+	}+}++int kgdb_remove_hw_break(unsigned long addr)+{+	int i, idx = -1;+	for (i = 0; i < 4; i++) {+		if (breakinfo[i].addr == addr && breakinfo[i].enabled) {+			idx = i;+			break;+		}+	}+	if (idx == -1)+		return -1;++	breakinfo[idx].enabled = 0;+	return 0;+}++int kgdb_set_hw_break(unsigned long addr)+{+	int i, idx = -1;+	for (i = 0; i < 4; i++) {+		if (!breakinfo[i].enabled) {+			idx = i;+			break;+		}+	}+	if (idx == -1)+		return -1;++	breakinfo[idx].enabled = 1;+	breakinfo[idx].type = 1;+	breakinfo[idx].len = 1;+	breakinfo[idx].addr = addr;+	return 0;+}++int remove_hw_break(unsigned breakno)+{+	if (!breakinfo[breakno].enabled) {+		return -1;+	}+	breakinfo[breakno].enabled = 0;+	return 0;+}++int set_hw_break(unsigned breakno, unsigned type, unsigned len, unsigned addr)+{+	if (breakinfo[breakno].enabled) {+		return -1;+	}+	breakinfo[breakno].enabled = 1;+	breakinfo[breakno].type = type;+	breakinfo[breakno].len = len;+	breakinfo[breakno].addr = addr;+	return 0;+}++void kgdb_disable_hw_debug(struct pt_regs *regs)+{+	/* Disable hardware debugging while we are in kgdb */+	asm volatile ("movq %0,%%db7": /* no output */ :"r" (0UL));+}++void kgdb_post_master_code(struct pt_regs *regs, int e_vector, int err_code)+{+	/* Master processor is completely in the debugger */

⌨️ 快捷键说明

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