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