From: "Jan Beulich" <JBeulich@novell.com>
To: <linux-kernel@vger.kernel.org>
Subject: [PATCH 22/39] NLKD - core
Date: Wed, 09 Nov 2005 15:18:55 +0100 [thread overview]
Message-ID: <4372135F.76F0.0078.0@novell.com> (raw)
In-Reply-To: 43721184.76F0.0078.0@novell.com
[-- Attachment #1: Type: text/plain, Size: 420 bytes --]
The core NLKD additions.
With other debugging code living scattered across the (official or
external) tree(s), this tries to atb once establish a common place
for debugging code in a new debug/ directory.
Note that this depends on the i386 cmpxchg adjustments patch, which
isn't in 2.6.14, but has supposedly been merged already into 2.6.15.
Signed-Off-By: Jan Beulich <jbeulich@novell.com>
(actual patch attached)
[-- Attachment #2: nlkd.patch --]
[-- Type: application/octet-stream, Size: 62349 bytes --]
The core NLKD additions.
With other debugging code living scattered across the (official or
external) tree(s), this tries to atb once establish a common place
for debugging code in a new debug/ directory.
Note that this depends on the i386 cmpxchg adjustments patch, which
isn't in 2.6.14, but has supposedly been merged already into 2.6.15.
Signed-Off-By: Jan Beulich <jbeulich@novell.com>
Index: 2.6.14-nlkd/Makefile
===================================================================
--- 2.6.14-nlkd.orig/Makefile 2005-11-09 11:12:42.000000000 +0100
+++ 2.6.14-nlkd/Makefile 2005-11-04 16:20:57.000000000 +0100
@@ -592,6 +592,7 @@ export MODLIB
ifeq ($(KBUILD_EXTMOD),)
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/
+core-$(CONFIG_DEBUG_KERNEL) += debug/
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
Index: 2.6.14-nlkd/debug/Kconfig
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/debug/Kconfig 2005-11-07 14:01:48.000000000 +0100
@@ -0,0 +1,22 @@
+choice
+ prompt "Kernel debugger"
+ optional
+ depends on DEBUG_KERNEL
+ ---help---
+ Kernel debuggers contain commands which allow memory to be examined,
+ instructions to be disassembled and breakpoints to be set.
+
+ If unsure, say N.
+
+config NLKD
+ bool "Novell Linux Kernel Debugger"
+ depends on DEBUG_KERNEL
+ depends on (X86_CMOVE && X86_CMPXCHG64 && X86_TSC) || X86_64
+ depends on !X86 || !OPROFILE
+ ---help---
+ This option provides a kernel debugger framework. Sub-component
+ selection will follow later.
+
+endchoice
+
+source "debug/nlkd/Kconfig"
Index: 2.6.14-nlkd/debug/Makefile
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/debug/Makefile 2005-11-04 14:15:23.000000000 +0100
@@ -0,0 +1 @@
+obj-$(CONFIG_NLKD) += nlkd/
Index: 2.6.14-nlkd/debug/nlkd/Kconfig
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/debug/nlkd/Kconfig 2005-11-04 09:52:36.000000000 +0100
@@ -0,0 +1,71 @@
+#*****************************************************************************
+#*
+#* File Name: Kconfig
+#* Created by: Jan Beulich
+#* %version: 5 %
+#* %derived_by: jbeulich %
+#* %date_modified: Thu Nov 03 04:12:25 2005 %
+#*
+#*****************************************************************************
+#*****************************************************************************
+#* *
+#* Copyright (c) 2004-2005 Novell, Inc. All Rights Reserved. *
+#* *
+#* This program is free software; you can redistribute it and/or *
+#* modify it under the terms of version 2 of the GNU General Public License *
+#* as published by the Free Software Foundation. *
+#* *
+#* 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. *
+#* *
+#* You should have received a copy of the GNU General Public License *
+#* along with this program; if not, contact Novell, Inc. *
+#* *
+#* To contact Novell about this file by physical or electronic mail, *
+#* you may find current contact information at www.novell.com. *
+#* *
+#*****************************************************************************
+#*****************************************************************************
+#*
+#* File Description:
+#*
+#*****************************************************************************
+
+config DEBUGRTL
+ tristate
+ default n
+
+config CDE
+ tristate "Core Debug Engine" #todo if ???
+ depends on NLKD
+ select DEBUGRTL
+ default NLKD
+ ---help---
+ This enables NLKD's core component. Front-end (agent) selection
+ will follow later.
+
+ If compiled as a module, the module will be called cde.
+
+config CDA
+ tristate "Console Debug Agent"
+ depends on CDE && (VGA_CONSOLE || FRAMEBUFFER_CONSOLE) && SERIO_I8042
+ default CDE
+ ---help---
+ This option provides a console based kernel debugger front-end.
+ See Documentation/cda.txt for additional information.
+
+ To compile this agent as a module, choose M here: the
+ module will be called cda.
+
+config RDA
+ tristate "Remote Debug Agent (EXPERIMENTAL)"
+ depends on CDE && EXPERIMENTAL
+ default n
+ ---help---
+ This option provides a remote kernel debugger interface supporting
+ gdb's protocol.
+
+ To compile this agent as a module, choose M here: the
+ module will be called rda.
Index: 2.6.14-nlkd/debug/nlkd/Makefile
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/debug/nlkd/Makefile 2005-11-09 10:50:39.000000000 +0100
@@ -0,0 +1,108 @@
+#*****************************************************************************
+#*
+#* File Name: Makefile
+#* Created by: Jan Beulich
+#* %version: 12 %
+#* %derived_by: jbeulich %
+#* %date_modified: Thu Nov 03 04:12:54 2005 %
+#*
+#*****************************************************************************
+#*****************************************************************************
+#* *
+#* Copyright (c) 2004-2005 Novell, Inc. All Rights Reserved. *
+#* *
+#* This program is free software; you can redistribute it and/or *
+#* modify it under the terms of version 2 of the GNU General Public License *
+#* as published by the Free Software Foundation. *
+#* *
+#* 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. *
+#* *
+#* You should have received a copy of the GNU General Public License *
+#* along with this program; if not, contact Novell, Inc. *
+#* *
+#* To contact Novell about this file by physical or electronic mail, *
+#* you may find current contact information at www.novell.com. *
+#* *
+#*****************************************************************************
+#*****************************************************************************
+#*
+#* File Description:
+#*
+#*****************************************************************************
+
+ifeq ($(CONFIG_DEBUGRTL),y)
+dbg := obj
+endif
+ifeq ($(CONFIG_DEBUGRTL),m)
+dbg := debugrtl
+obj-m := debugrtl.o
+dbg-y :=
+endif
+
+ifeq ($(CONFIG_CDE),y)
+cde := obj
+endif
+ifeq ($(CONFIG_CDE),m)
+cde := cde
+obj-m := cde.o
+cde-y :=
+endif
+
+arch-$(CONFIG_X86) := $(if $(CONFIG_X86_64),AMD64,IA32)
+arch-$(CONFIG_IA64) := IA64
+export arch-y
+
+obj-y := nlkd.o nlkd$(arch-y).o
+$(dbg)-$(CONFIG_DEBUGRTL) += dbgutil.o dbg$(arch-y).o
+$(cde)-y += cde$(arch-y).o cdeext.o cdefocus.o cdemain.o \
+ cde$(arch-y)lock.o cdemem.o cdestatemach.o \
+ cdesym.o $(if $(CONFIG_IA64),,cdeunwind.o) \
+ cdeutil.o cde$(arch-y)util.o
+$(cde)-$(CONFIG_MODULES) += cde_syms.o
+$(cde)-$(CONFIG_SMP) += cderendezvous.o cderpc.o
+$(cde)-$(CONFIG_EFI) += cdeefi.o
+$(cde)-$(CONFIG_X86) += cdeX86brkp.o
+$(cde)-$(CONFIG_IA64) += cdeIA64brkp.o
+
+obj-$(CONFIG_CDA) += cda/
+obj-$(CONFIG_RDA) += rda/
+
+EXTRA_AFLAGS := -Wa,--strip-local-absolute
+
+# Need a version of 'as' that supports various features not present or broken
+# in older binutils versions. But since one can't tell gcc what assembler
+# binary to use we have to use another compiler driver that will find the
+# right assembler if the default one doesn't fit our needs. (Note that -Wa,-Z
+# below is necessary because otherwise, up to version 2.15, it will [try to]
+# unlink /dev/null [and succeed at least when run as root]).
+
+assembler_test_body-y := .altmacro;
+assembler_test_body-y += .macro .xyz; .endm; .xyz;
+assembler_test_body-y += .struct; .previous;
+ifneq ($(CONFIG_IA64),y)
+assembler_test_body-$(CONFIG_UNWIND_INFO) += .cfi_startproc;
+ifeq ($(CONFIG_X86),y)
+assembler_test_body-$(CONFIG_UNWIND_INFO) += .cfi_rel_offset $(if $(CONFIG_X86_64),r,e)flags, 0;
+endif
+assembler_test_body-$(CONFIG_UNWIND_INFO) += .cfi_endproc;
+endif
+assembler_test_body-$(CONFIG_X86) += .intel_syntax noprefix;
+assembler_test_body-$(CONFIG_X86) += .bss; .previous;
+assembler_test_body-$(CONFIG_X86) += push (1 shl 1) or not (1 shr 1) mod (1 and 1 xor 2);
+assembler_test_body-$(CONFIG_X86) += .equiv dword, 4; .equiv reg, eax; lea reg, [reg*dword];
+
+assembler_test = $(shell echo '$(assembler_test_body-y)' \
+ | $(1) -c -o /dev/null -Wa,-Z -xassembler-with-cpp - 2>&1 >/dev/null)
+
+ifneq ($(call assembler_test,$(CC)),)
+CCx := $(shell echo '$(CC)' | sed 's,\(^\|[[:space:]]\)\([^=[:space:]]\+\)\([[:space:]]\|$$\),\1\2x\3,')
+ifneq ($(shell which $(filter-out -%,$(CCx)) 2>/dev/null | grep '/$(CCx)$$'),)
+ifneq ($(call assembler_test,$(CCx)),)
+CCx := echo "Assembler update needed" >&2 && /bin/false
+endif
+endif
+override cmd_as_o_S = $(CCx) $(a_flags) -c -o $@ $<
+endif
Index: 2.6.14-nlkd/debug/nlkd/nlkd.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/debug/nlkd/nlkd.c 2005-11-03 12:23:43.000000000 +0100
@@ -0,0 +1,161 @@
+/*****************************************************************************
+ *
+ * File Name: nlkd.c
+ * Created by: Jan Beulich
+ * %version: 4 %
+ * %derived_by: jbeulich %
+ * %date_modified: Thu Nov 03 04:23:30 2005 %
+ *
+ *****************************************************************************/
+/*****************************************************************************
+ * *
+ * Copyright (c) 1999-2005 Novell, Inc. All Rights Reserved. *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of version 2 of the GNU General Public License *
+ * as published by the Free Software Foundation. *
+ * *
+ * 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. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, contact Novell, Inc. *
+ * *
+ * To contact Novell about this file by physical or electronic mail, *
+ * you may find current contact information at www.novell.com. *
+ * *
+ *****************************************************************************/
+/*****************************************************************************
+ *
+ * File Description:
+ *
+ *****************************************************************************/
+
+#include <linux/module.h>
+#include <linux/nlkd.h>
+#include <asm/fta-frame.h>
+#include <asm/fta-type.h>
+#include <asm/segment.h>
+#include "nlkd.h"
+
+#if defined(_M_IA64) || defined(__ia64__)
+# include "nlkdIA64.h"
+#elif defined(_M_IX86) || defined(__i386__)
+# include "nlkdIA32.h"
+#elif defined(_M_AMD64) || defined(__x86_64__)
+# include "nlkdAMD64.h"
+#endif
+
+EXPORT_SYMBOL(nlkdAssert);
+EXPORT_SYMBOL(nlkdDebugEvent);
+EXPORT_SYMBOL(nlkdEnterDebugger);
+EXPORT_SYMBOL(nlkdPanic);
+
+#ifdef CONFIG_NLKD_FTA
+struct notifier_block *nlkd_keypress_chain = NULL;
+EXPORT_SYMBOL(nlkd_keypress_chain);
+#endif
+
+volatile int nlkdAgentCount = -1;
+#ifndef CONFIG_CDE
+EXPORT_SYMBOL(nlkdAgentCount);
+const struct nlkdBPXface_s*nlkdBPXface = NULL;
+EXPORT_SYMBOL(nlkdBPXface);
+#endif
+
+#ifndef CONFIG_CDE
+# include <asm/debugreg.h>
+void (*set_debugreg)(uintptr_t value, nuint_t regnum) = _set_debugreg;
+EXPORT_SYMBOL(set_debugreg);
+static int _enable_debugreg(struct task_struct *task, nuint_t regnum, uintptr_t value) {}
+int (*enable_debugreg)(struct task_struct *, nuint_t, uintptr_t) = _enable_debugreg;
+EXPORT_SYMBOL(enable_debugreg);
+int (*disable_debugreg)(struct pt_regs *, nuint_t) = _disable_debugreg;
+EXPORT_SYMBOL(disable_debugreg);
+int (*restore_debugreg)(void) = _restore_debugreg;
+EXPORT_SYMBOL(restore_debugreg);
+#endif
+
+#if defined(CONFIG_X86)
+# ifdef CONFIG_X86_64
+# define PLT(x) AMD64_##x
+# define PC rip
+# else
+# define PLT(x) IA32_##x
+# define PC eip
+# endif
+# define TYPE PLT(BREAKPOINT)
+# define SUBTYPE eax
+# define TARGET _nlkdEnterDebuggerInstruction_
+# define EXTRA FRAME_PTREGS(frame, cs) == __KERNEL_CS
+# define IPI_TYPE PLT(NMI)
+# define IPI_SUBTYPE cr2
+#elif defined(CONFIG_IA64)
+# define PC iip
+# define TYPE IA64_BREAKFLT
+# define SUBTYPE r8
+# define TARGET _nlkdEnterDebuggerBundle_
+# define EXTRA frame->iim == BREAK_ENTER_DEBUGGER
+# define IPI_TYPE PLT(NMI)
+# define IPI_SUBTYPE iim
+#endif
+
+int nlkdIsDebugEvent(const struct ftaInterruptionCtx_s*frame) {
+ extern const char TARGET[];
+
+ return frame->type == TYPE
+ && FRAME_PTREGS(frame, PC) == (uintptr_t)TARGET
+ && EXTRA;
+}
+EXPORT_SYMBOL(nlkdIsDebugEvent);
+
+#ifndef CONFIG_NLKD_FTA
+void nlkdSetDebugEventType(struct ftaInterruptionCtx_s*frame) {
+ if(!frame->sub_type) {
+ if(nlkdIsDebugEvent(frame))
+ frame->sub_type = FRAME_PTREGS(frame, SUBTYPE);
+ else if(frame->type == IPI_TYPE) {
+ frame->sub_type = frame->IPI_SUBTYPE;
+ frame->IPI_SUBTYPE = 0;
+ }
+ }
+}
+EXPORT_SYMBOL(nlkdSetDebugEventType);
+#endif
+
+#undef IPI_TYPE
+#undef IPI_SUBTYPE
+#undef EXTRA
+#undef TARGET
+#undef SUBTYPE
+#undef TYPE
+#undef PC
+#undef PLT
+
+void nlkd_init() {
+ extern nlkdExtension_t __start_nlkd_ext[], __stop_nlkd_ext[];
+ nlkdExtension_t*ext;
+
+ for(ext = __start_nlkd_ext; ext < __stop_nlkd_ext; ++ext) {
+ LSTATUS status = nlkdExtRegister(ext->id,
+ ext->handler,
+ ext->handlerContext,
+ *ext->pModuleId,
+ ext->description,
+ ext->flags);
+ if(status != LSTATUS_SUCCESS)
+ printk(KERN_WARNING "Registration of %s debug extension failed (%08"NPRIX")\n",
+ ext->id,
+ status);
+ }
+ cde_init();
+}
+
+void nlkd_init_done() {
+ cde_init_done();
+}
+
+#define NLKD
+#include "cdeext.c"
Index: 2.6.14-nlkd/debug/nlkd/nlkd.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/debug/nlkd/nlkd.h 2005-10-07 17:18:18.000000000 +0200
@@ -0,0 +1,48 @@
+/*****************************************************************************
+ *
+ * File Name: nlkd.h
+ * Created by: Jan Beulich
+ * %version: 2 %
+ * %derived_by: jbeulich %
+ * %date_modified: Fri Oct 07 09:18:08 2005 %
+ *
+ *****************************************************************************/
+/*****************************************************************************
+ * *
+ * Copyright (c) 1999-2005 Novell, Inc. All Rights Reserved. *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of version 2 of the GNU General Public License *
+ * as published by the Free Software Foundation. *
+ * *
+ * 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. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, contact Novell, Inc. *
+ * *
+ * To contact Novell about this file by physical or electronic mail, *
+ * you may find current contact information at www.novell.com. *
+ * *
+ *****************************************************************************/
+/*****************************************************************************
+ *
+ * File Description:
+ *
+ *****************************************************************************/
+
+extern volatile int nlkdAgentCount;
+
+#ifdef CONFIG_CDE
+
+void cde_init(void);
+void cde_init_done(void);
+
+#else
+
+# define cde_init()
+# define cde_init_done()
+
+#endif
Index: 2.6.14-nlkd/include/linux/fta.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/include/linux/fta.h 2005-11-03 12:03:37.000000000 +0100
@@ -0,0 +1,261 @@
+/*****************************************************************************
+ *
+ * File Name: fta.h
+ * Created by: Jan Beulich
+ * %version: 12 %
+ * %derived_by: jbeulich %
+ * %date_modified: Thu Nov 03 04:03:24 2005 %
+ *
+ *****************************************************************************/
+/*****************************************************************************
+ * *
+ * Copyright (c) 2004-2005 Novell, Inc. All Rights Reserved. *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of version 2 of the GNU General Public License *
+ * as published by the Free Software Foundation. *
+ * *
+ * 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. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, contact Novell, Inc. *
+ * *
+ * To contact Novell about this file by physical or electronic mail, *
+ * you may find current contact information at www.novell.com. *
+ * *
+ *****************************************************************************/
+/*****************************************************************************
+ *
+ * File Description:
+ *
+ *****************************************************************************/
+#ifndef _LINUX_FTA_H
+# define _LINUX_FTA_H
+
+# include <linux/config.h>
+# include <asm/fta-type.h>
+
+typedef enum ftaInterruptionId_e ftaInterruptionId_t;
+typedef struct ftaInterruptionCtx_s ftaFullInterruptionCtx_t;
+
+# ifdef CONFIG_NLKD_FTA
+# include <linux/linkage.h>
+# include <linux/lstatus.h>
+# include <linux/module-id.h>
+# include <linux/nint.h>
+
+/* --------------------------------------------------------------------------- */
+/* LSTATUS Defines for */
+/* ftaFaultInterruption..., ftaTrapInterruption... and ftaAbortInterruption... */
+/* --------------------------------------------------------------------------- */
+
+# define LSTATUS_FTA_HANDLED MAKE_LSTATUS(FTA, SUCCESS, 0)
+# define LSTATUS_FTA_NOT_HANDLED MAKE_LSTATUS(FTA, INFORMATION, 0x0100)
+# define LSTATUS_FTA_ID_INVALID MAKE_LSTATUS(FTA, ERROR, 0x0100)
+# define LSTATUS_FTA_ROUTINE_ADDR_INVALID MAKE_LSTATUS(FTA, ERROR, 0x0101)
+# define LSTATUS_FTA_STAGE_INVALID MAKE_LSTATUS(FTA, ERROR, 0x0102)
+# define LSTATUS_FTA_STAGE_NOT_AVAILABLE MAKE_LSTATUS(FTA, ERROR, 0x0103)
+# define LSTATUS_FTA_TAG_ALLOC_FAILURE MAKE_LSTATUS(FTA, ERROR, 0x0104)
+# define LSTATUS_FTA_SIGNATURE_INVALID MAKE_LSTATUS(FTA, ERROR, 0x0105)
+# define LSTATUS_FTA_TAG_INVALID MAKE_LSTATUS(FTA, ERROR, 0x0106)
+
+typedef enum ftaInterruptionId_e fta_id_t;
+struct pt_regs;
+
+/*
+ * ftaInterruptionTag_t
+ *
+ * ftaInterruptionTag_t is used as a handle. When ftaInterruptionSetup()
+ * is called it is passed the address of a variable type of ftaInterruptionTag_t.
+ *
+ * When ftaInterruptionSetup() successfully completes ftaInterruptionTag_t
+ * contains a valid value that can should be used as a parameter when
+ * ftaInterruptionClear() is called.
+ */
+typedef struct ftaInterruption *ftaInterruptionTag_t, *fta_tag_t;
+
+/*
+ * Special flags for this interruption handler.
+ */
+typedef uint64_t ftaInterruptionFlags_t;
+
+/*
+ * ftaInterruptionStage_t
+ *
+ * ftaInterruptionStage_t is used as a parameter to ftaTrapInterruptionSetup(),
+ * ftaFaultInterruptionSetup() and ftaAbortInterruptionSetup().
+ *
+ * It is used to indicate during which stage the interruption handler should
+ * be called. For each interruption there may be a specific order in which
+ * different handlers should be called. The callout order is referred to as
+ * the stage and may be interruption specific. Providing for a stage
+ * definition for handlers allows the infrastructure to prioritize the callout
+ * order of handlers by stage type.
+ *
+ * Interruption stages as defined as follows:
+ *
+ * FTA_INTERRUPTION_NOTIFIER_ENTRY
+ * Frame Modification: Not Allowed
+ * Number Of Handlers: Multiple
+ * Other Notes: Entry notifier slots are provided for debug purposes.
+ * The handler is invoked just after the frame has been
+ * saved but before any other handlers are called.
+ * These handlers may examine the frame but may not
+ * modify it in any way whatsoever. Notifiers are
+ * maintained on a linked list and are called on a
+ * first linked, first called basis.
+ *
+ * FTA_INTERRUPTION_NOTIFIER_EXIT
+ * Frame Modification: Not Allowed
+ * Number Of Handlers: Multiple
+ * Other Notes: Exit notifier slots are provided for debug purposes.
+ * The handler is invoked after other handlers have
+ * been called and just before the stack frame is
+ * restored prior to a return from interruption.
+ * These handlers may examine the frame but may not
+ * modify it in any way whatsoever. Notifiers are
+ * maintained on a linked list and are called on a
+ * first linked, first called basis.
+ *
+ * FTA_INTERRUPTION_HANDLER_DEFAULT
+ * Frame Modification: Allowed
+ * Number Of Handlers: One
+ * Other Notes: This is the OS default handler for the interruption.
+ * This handler slot is reserved for OS kernel use only.
+ * An attempt to register for this handler slot will fail
+ * until the previous handler has been cleared.
+ *
+ * FTA_INTERRUPTION_HANDLER_GENERAL_PURPOSE
+ * Frame Modification: Allowed
+ * Number Of Handlers: Multiple
+ * Other Notes: General purpose handlers are maintained on a
+ * linked list and are called on a first linked, first
+ * called basis. When a handler of this type claims
+ * the interruption has been handled by its return
+ * status other general purpose handlers will not be
+ * invoked.
+ *
+ * FTA_INTERRUPTION_HANDLER_HEALTH_MONITOR
+ * Frame Modification: Not Allowed
+ * Number Of Handlers: One
+ * Other Notes: The health driver may perform such actions as
+ * monitoring the health of the system or logging
+ * the cause of critical errors to NVRAM prior to a
+ * system crash. A health handler may view the contents
+ * of the frame but should not modify the frame contents.
+ * If modification of the frame is required a separate
+ * general purpose handler should be registered.
+ * An attempt to register for this handler slot will fail
+ * until the previous handler has been cleared.
+ *
+ * FTA_INTERRUPTION_HANDLER_APPLICATION_DEBUGGER
+ * Frame Modification: Allowed
+ * Number Of Handlers: Multiple
+ * Other Notes: An application level debugger registration will
+ * take precedence over kernel level debuggers.
+ *
+ * FTA_INTERRUPTION_HANDLER_CORE_DEBUG_ENGINE
+ * Frame Modification: Allowed
+ * Number Of Handlers: One
+ * Other Notes: The intention here is to allow the CDE an early peek at the
+ * the frame to recover from internally generated interruptions.
+ *
+ * FTA_INTERRUPTION_PATCH_REPLACEMENT
+ * Frame Modification: Allowed
+ * Number Of Handlers: One
+ * Other Notes: A patch replacement handler provides a mechanism whereby
+ * the infrastructure for a given interruption may be
+ * completely replaced. The writer of this handler should
+ * be intimately familiar with the requirements of the
+ * interruption event. This slot is provided as a means
+ * field replacement of the interruption handling infrastructure
+ * may be replaced. Please see ftaGetInterruptionHandlers()
+ * for more information on how to find and call registered
+ * handlers for the given interruption ID.
+ * An attempt to register for this handler slot will fail
+ * until the previous handler has been cleared.
+ */
+typedef enum {
+ FTA_INTERRUPTION_NOTIFIER_ENTRY,
+ FTA_INTERRUPTION_NOTIFIER_EXIT,
+ FTA_INTERRUPTION_HANDLER_DEFAULT,
+ FTA_INTERRUPTION_HANDLER_GENERAL_PURPOSE,
+ FTA_INTERRUPTION_HANDLER_HEALTH_MONITOR,
+ FTA_INTERRUPTION_HANDLER_APPLICATION_DEBUGGER,
+ FTA_INTERRUPTION_HANDLER_CORE_DEBUG_ENGINE,
+ FTA_INTERRUPTION_PATCH_REPLACEMENT
+} ftaInterruptionStage_t;
+
+typedef enum {
+ FTA_NOTIFIER_ENTRY = FTA_INTERRUPTION_NOTIFIER_ENTRY,
+ FTA_NOTIFIER_EXIT = FTA_INTERRUPTION_NOTIFIER_EXIT,
+ FTA_HANDLER_DEFAULT = FTA_INTERRUPTION_HANDLER_DEFAULT,
+ FTA_HANDLER_GENERAL_PURPOSE = FTA_INTERRUPTION_HANDLER_GENERAL_PURPOSE,
+ FTA_HANDLER_HEALTH_MONITOR = FTA_INTERRUPTION_HANDLER_HEALTH_MONITOR,
+ FTA_HANDLER_APPLICATION_DEBUGGER = FTA_INTERRUPTION_HANDLER_APPLICATION_DEBUGGER
+} fta_stage_t;
+
+typedef enum {
+ fta_no_async,
+ fta_async_breakpoints,
+ fta_async_interrupts,
+ fta_async_preemption
+} fta_async_level_t;
+
+# ifndef MODULE
+void asmlinkage ftaAbandonFrame(const ftaFullInterruptionCtx_t *);
+# endif
+
+# ifndef FTA_EXPORT
+# define FTA_EXPORT(type, name, ...) type name(__VA_ARGS__)
+# endif
+
+# else /* CONFIG_NLKD_FTA */
+# undef FTA_EXPORT
+# endif /* CONFIG_NLKD_FTA */
+#endif /* _LINUX_FTA_H */
+
+#ifdef FTA_EXPORT
+# include <asm/fta.h>
+
+FTA_EXPORT(LSTATUS, ftaInterruptionSetup,
+ ftaInterruptionId_t,
+ LSTATUS (*)(void *, ftaFullInterruptionCtx_t *),
+ void *,
+ ftaInterruptionFlags_t,
+ ftaInterruptionStage_t,
+ moduleId_t,
+ ftaInterruptionTag_t *);
+FTA_EXPORT(LSTATUS, ftaInterruptionClear, ftaInterruptionTag_t);
+
+FTA_EXPORT(fta_async_level_t, ftaEnable,
+ ftaFullInterruptionCtx_t *,
+ fta_async_level_t);
+FTA_EXPORT(const char*, ftaGetInterruptionName,
+ const ftaFullInterruptionCtx_t *);
+FTA_EXPORT(void, ftaRestore, ftaFullInterruptionCtx_t *, fta_async_level_t);
+
+FTA_EXPORT(int, fta_register_handler,
+ fta_id_t,
+ int(*)(struct pt_regs *, void *),
+ void *,
+ unsigned long flags,
+ fta_stage_t,
+ moduleId_t,
+ fta_tag_t *);
+FTA_EXPORT(int, fta_deregister_handler, fta_tag_t);
+
+FTA_EXPORT(fta_id_t, fta_type, const struct pt_regs *);
+FTA_EXPORT(int, fta_subtype, const struct pt_regs *);
+FTA_EXPORT(void, fta_subtype_set, struct pt_regs *, int);
+FTA_EXPORT(int, fta_from_kernel, const struct pt_regs *);
+
+FTA_EXPORT(void, fta_abandon, const struct pt_regs *);
+FTA_EXPORT(fta_async_level_t, fta_enable, struct pt_regs *, fta_async_level_t);
+FTA_EXPORT(void, fta_restore, struct pt_regs *, fta_async_level_t);
+
+# undef FTA_EXPORT
+#endif /* FTA_EXPORT */
Index: 2.6.14-nlkd/include/linux/lstatus.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/include/linux/lstatus.h 2005-06-27 12:49:22.000000000 +0200
@@ -0,0 +1,241 @@
+/*****************************************************************************
+ *
+ * File Name: lstatus.h
+ * Created by: Clyde Griffin
+ * Date created: 11/1/1998
+ *
+ * %version: 6 %
+ * %derived_by: jbeulich %
+ * %date_modified: Mon Jun 27 04:49:11 2005 %
+ *
+ *****************************************************************************/
+/*****************************************************************************
+ * *
+ * Copyright (c) 1998-2005 Novell, Inc. All Rights Reserved. *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of version 2 of the GNU General Public License *
+ * as published by the Free Software Foundation. *
+ * *
+ * 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. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, contact Novell, Inc. *
+ * *
+ * To contact Novell about this file by physical or electronic mail, *
+ * you may find current contact information at www.novell.com. *
+ * *
+ *****************************************************************************/
+/*****************************************************************************
+ *
+ * File Description:
+ *
+ *****************************************************************************/
+
+#ifndef _LINUX_LSTATUS_H
+#define _LINUX_LSTATUS_H
+
+#include <linux/config.h>
+#ifdef __ASSEMBLY__
+# define NUINT_C(v) v
+#else
+# include <linux/nint.h>
+#endif
+
+/*
+ * The purpose of this file is to provide a common format and encoding
+ * scheme for API status codes.
+ * The status classification and naming conventions used in this file are
+ * as follows.
+ *
+ * LSTATUS is defined as a native unsigned return code. There are four
+ * parts to the status. The low bits contain the status code. The next
+ * portion contains the sybsystem identifier, followed by an optional
+ * subsystem specific unique identifier. The top bits
+ * The unique ID may be used in a number of ways and is subsystem
+ * specific. It is optional and should be zero if not used.
+ *
+ * The LSTATUS return code may be viewed as a union defined as follows:
+ *
+ * typedef union {
+ * struct {
+ * nuint_t status:N1;
+ * nuint_t subsystem:N2;
+ * nuint_t uniqueId:N3;
+ * nuint_t category:N4;
+ * } fields;
+ * LSTATUS status;
+ * } lStatus_t;
+ *
+ * Each major subsystem within may allocate a range of status codes by
+ * adding a #define to the classification section below.
+ * The convention allows for 255/65535 subsystems in the system with each
+ * subsystem being allowed to define up to as many as 4095/65535 unique
+ * status codes or errors. This should be adequate.
+ *
+ * The first subsystem known as LSTATUS_ is a general purpose
+ * classification to be used for smaller subsystems, components or
+ * stand alone APIs which do not clearly fit into a larger grouping.
+ * Status code additions to the general area should be carefully chosen
+ * and somewhat generic in flavor as another developer of a different
+ * component may also use that defined status/error code.
+ *
+ * In general you are encouraged to create unique classifications
+ * for large and middle sized subcomponents of the kernel.
+ *
+ * Status code return types are 32/64 bits in size.
+ *
+ * Nano kernel subsystems are numbered using bits 31:16.
+ *
+ * Status codes within each subsystem are defined using bits 15:0.
+ *
+ * The status codes 0-255 in each {category,subsystem} must be identical
+ * to those in the generic subsystem. The first unique status code in any
+ * given subsystem should not be less than 256. This convention will
+ * allow us to become familiar with return codes < 256 regardless of what
+ * subsystem the status code came from.
+ *
+ * We do not expect to have more that 256 generic status codes.
+ *
+ * Specific status definitions within a general classification may be
+ * defined in another header file more specific to the subcomponent.
+ * However, general subsystem classifications must be defined in this
+ * file and listed in numeric order. Status code definitions in the generic
+ * classification, LSTATUS_, must also be listed in this file.
+ *
+ * APIs returning status codes defined by this file must be declared to
+ * return LSTATUS. LSTATUS is defined as a nuint_t.
+ *
+ *
+ * Naming:
+ * For the purposes of providing a common look and feel, and to avoid
+ * naming conflicts the defined names of each status code shall follow the
+ * rules below.
+ *
+ * 1) The status code will be described in all capital letters with the under
+ * score chararacter separating descriptive words.
+ *
+ * 2) The status code will be prefixed with the classification name.
+ * Example: Status codes in the SCHED subclassification will begin
+ * with LSTATUS_SCHED.
+ *
+ * 3) The descriptive portion of the status code definition will follow the
+ * the general classification.
+ * Example: LSTATUS_SCHED_PARAMETER_INVALID.
+ *
+ */
+
+#if defined(CONFIG_X86_64) || !defined(CONFIG_64BIT)
+# define LSTATUS_WIDTH_STATUS 12
+# define LSTATUS_WIDTH_SUBSYSTEM 8
+# define LSTATUS_WIDTH_UNIQUEID 9
+# define LSTATUS_WIDTH_CATEGORY 3
+#else
+# define LSTATUS_WIDTH_STATUS 16
+# define LSTATUS_WIDTH_SUBSYSTEM 16
+# define LSTATUS_WIDTH_UNIQUEID 28
+# define LSTATUS_WIDTH_CATEGORY 4
+#endif
+
+#ifndef __ASSEMBLY__
+/* ----------------------------------------------------------------------- */
+/* */
+/* ----------------------------------------------------------------------- */
+/*
+ *
+ * Use LSTATUS when declaring APIs that return status code definitions defined
+ * using the conventions outlined in this file.
+ *
+ * Example: LSTATUS foo(void);
+ */
+typedef nuint_t LSTATUS;
+
+typedef union {
+ struct {
+ nuint_t status:LSTATUS_WIDTH_STATUS;
+ nuint_t subsystem:LSTATUS_WIDTH_SUBSYSTEM;
+ nuint_t uniqueId:LSTATUS_WIDTH_UNIQUEID;
+ nuint_t category:LSTATUS_WIDTH_CATEGORY;
+ } fields;
+ LSTATUS status;
+} lStatus_t;
+
+typedef struct { int _:sizeof(lStatus_t) <= sizeof(LSTATUS); } lStatus_Size_Assert;
+
+#endif /* __ASSEMBLY__ */
+
+/* ----------------------------------------------------------------------- */
+/* */
+/* ----------------------------------------------------------------------- */
+/*
+ * Status code category classifications.
+ */
+#define LSTATUS_CATEGORY_SUCCESS NUINT_C(0)
+#define LSTATUS_CATEGORY_INFORMATION NUINT_C(1)
+#define LSTATUS_CATEGORY_NOTICE NUINT_C(2)
+#define LSTATUS_CATEGORY_WARNING NUINT_C(3)
+#define LSTATUS_CATEGORY_ERROR ((NUINT_C(1) << LSTATUS_WIDTH_CATEGORY) - 4)
+#define LSTATUS_CATEGORY_FATAL ((NUINT_C(1) << LSTATUS_WIDTH_CATEGORY) - 1)
+
+/* ----------------------------------------------------------------------- */
+/* */
+/* ----------------------------------------------------------------------- */
+/*
+ * Status code subsystem classifications.
+ */
+#define LSTATUS_SUBSYS_ 0x0000
+#define LSTATUS_SUBSYS_SCHED 0x0001
+#define LSTATUS_SUBSYS_MEMORY 0x0002
+#define LSTATUS_SUBSYS_MMU 0x0003
+#define LSTATUS_SUBSYS_INTR 0x0004
+#define LSTATUS_SUBSYS_FTA 0x0005
+#define LSTATUS_SUBSYS_CPU 0x0006
+#define LSTATUS_SUBSYS_RESOURCE 0x0007
+#define LSTATUS_SUBSYS_CONSOLE 0x0008
+#define LSTATUS_SUBSYS_CIOS 0x0009
+#define LSTATUS_SUBSYS_PSM 0x000A
+#define LSTATUS_SUBSYS_TIMEOUT 0x000B
+
+
+/* ----------------------------------------------------------------------- */
+/* */
+/* ----------------------------------------------------------------------- */
+/*
+ * LSTATUS construction.
+ */
+#define MAKE_LSTATUS(sub, cat, code) \
+ (((((LSTATUS_CATEGORY_##cat << LSTATUS_WIDTH_UNIQUEID) \
+ << LSTATUS_WIDTH_SUBSYSTEM) | LSTATUS_SUBSYS_##sub) \
+ << LSTATUS_WIDTH_STATUS) | (code))
+#define MAKE_LSTATUS_UNIQUE(sub, cat, uid, code) \
+ ((((((LSTATUS_CATEGORY_##cat \
+ << LSTATUS_WIDTH_UNIQUEID) | (uid)) \
+ << LSTATUS_WIDTH_SUBSYSTEM) | LSTATUS_SUBSYS_##sub) \
+ << LSTATUS_WIDTH_STATUS) | (code))
+
+/* ----------------------------------------------------------------------- */
+/* */
+/* ----------------------------------------------------------------------- */
+/*
+ * LSTATUS_ classification.
+ *
+ * LSTATUS_ is a generic classification. These definitions may be used
+ * by small subsystems or stand alone APIs which do not require status
+ * code definitions within a unique range.
+ */
+#define LSTATUS_SUCCESS MAKE_LSTATUS(, SUCCESS, 0x0000)
+#define LSTATUS_DEFERRED MAKE_LSTATUS(, SUCCESS, 0x0001)
+#define LSTATUS_FAILURE MAKE_LSTATUS(, ERROR, 0x0001)
+#define LSTATUS_PARAMETER_INVALID MAKE_LSTATUS(, ERROR, 0x0002)
+#define LSTATUS_PARAMETER_NULL MAKE_LSTATUS(, ERROR, 0x0003)
+#define LSTATUS_PARAMETER_OUT_OF_RANGE MAKE_LSTATUS(, ERROR, 0x0004)
+#define LSTATUS_PARAMETER_INCORRECT_TYPE MAKE_LSTATUS(, ERROR, 0x0005)
+#define LSTATUS_INVALID_MODULE_ID MAKE_LSTATUS(, ERROR, 0x0006)
+#define LSTATUS_BUFFER_MISALIGNED MAKE_LSTATUS(, ERROR, 0x0007)
+
+#define LSTATUS_MEMORY_UNAVAILABLE MAKE_LSTATUS(MEMORY, ERROR, 0x0000)
+
+#endif /* _LINUX_LSTATUS_H */
Index: 2.6.14-nlkd/include/linux/module-id.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/include/linux/module-id.h 2005-06-27 12:49:47.000000000 +0200
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ *
+ * File Name: module-id.h
+ * Created by: Clyde Griffin
+ * Date created: 11/1/1998
+ *
+ * %version: 5 %
+ * %derived_by: jbeulich %
+ * %date_modified: Mon Jun 27 04:49:36 2005 %
+ *
+ *****************************************************************************/
+/*****************************************************************************
+ * *
+ * Copyright (c) 1998-2005 Novell, Inc. All Rights Reserved. *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of version 2 of the GNU General Public License *
+ * as published by the Free Software Foundation. *
+ * *
+ * 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. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, contact Novell, Inc. *
+ * *
+ * To contact Novell about this file by physical or electronic mail, *
+ * you may find current contact information at www.novell.com. *
+ * *
+ *****************************************************************************/
+/*****************************************************************************
+ *
+ * File Description:
+ *
+ *****************************************************************************/
+
+#ifndef _LINUX_MODULE_ID_H
+#define _LINUX_MODULE_ID_H
+
+typedef struct module * moduleId_t;
+
+/* Since THIS_MODULE is NULL for components not built as module, and
+ since we need a non-NULL unique per-component ID in various places,
+ we fake things here. */
+#ifdef MODULE
+extern struct module __this_module;
+# define THIS_MODULE_ID(ident) const moduleId_t ident = &__this_module
+#else
+# define THIS_MODULE_ID(ident) const moduleId_t ident = (moduleId_t)&ident
+#endif
+
+#endif /* _LINUX_MODULE_ID_H */
Index: 2.6.14-nlkd/include/linux/nint.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/include/linux/nint.h 2005-06-27 14:05:48.000000000 +0200
@@ -0,0 +1,240 @@
+/*****************************************************************************
+ *
+ * File Name: nint.h
+ * Created by: Clyde Griffin
+ * Date created: 11/1/1998
+ *
+ * %version: 5 %
+ * %derived_by: jbeulich %
+ * %date_modified: Mon Jun 27 04:50:01 2005 %
+ *
+ *****************************************************************************/
+/*****************************************************************************
+ * *
+ * Copyright (c) 1998-2005 Novell, Inc. All Rights Reserved. *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of version 2 of the GNU General Public License *
+ * as published by the Free Software Foundation. *
+ * *
+ * 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. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, contact Novell, Inc. *
+ * *
+ * To contact Novell about this file by physical or electronic mail, *
+ * you may find current contact information at www.novell.com. *
+ * *
+ *****************************************************************************/
+/*****************************************************************************
+ *
+ * File Description:
+ *
+ *****************************************************************************/
+
+#ifndef _LINUX_NINT_H
+#define _LINUX_NINT_H
+
+#include <linux/config.h>
+#include <linux/stddef.h>
+#include <linux/types.h>
+#include <linux/nls.h> /* for wchar_t */
+
+/*
+ * Alignment Macros for LoHi Machine Types
+ */
+#ifndef STRICT_ALIGNMENT
+# if defined(_M_IX86) || defined(__i386__) \
+ || defined(_M_AMD64) || defined(__x86_64__)
+# define STRICT_ALIGNMENT 0
+# else
+# define STRICT_ALIGNMENT 1
+# endif
+#endif
+#ifndef UNALIGNED_SUPPORT
+# if defined(__INTEL_COMPILER) || (defined(_MSC_VER) && defined(_M_IA64))
+# define UNALIGNED_SUPPORT __unaligned
+# elif !STRICT_ALIGNMENT
+# define UNALIGNED_SUPPORT
+# endif
+#endif
+
+#if defined(_M_IA64) || defined(__ia64__)
+
+# define NATIVE_APPEND_(p) p##64
+# define NATIVE_EMBED_(p, s) p##64##s
+# define PHYSADDR_APPEND_(p) p##64
+# define PHYSADDR_EMBED_(p, s) p##64##s
+
+#elif defined(_M_IX86) || defined(__i386__) \
+ || defined(_M_AMD64) || defined(__x86_64__)
+
+# define NATIVE_APPEND_(p) p##32
+# define NATIVE_EMBED_(p, s) p##32##s
+# define PHYSADDR_APPEND_(p) p##64
+# define PHYSADDR_EMBED_(p, s) p##64##s
+
+#elif !defined(NATIVE_APPEND_) || !defined(NATIVE_EMBED_) || !defined(PHYSADDR_APPEND_) || !defined(PHYSADDR_EMBED_)
+# error Unimplemented!
+#endif
+
+#ifdef CONFIG_64BIT
+# define POINTER_APPEND_(p) p##64
+# define POINTER_EMBED_(p, s) p##64##s
+#else
+# define POINTER_APPEND_(p) p##32
+# define POINTER_EMBED_(p, s) p##32##s
+#endif
+
+typedef POINTER_EMBED_(int, _t) intptr_t;
+typedef POINTER_EMBED_(uint, _t) uintptr_t;
+typedef NATIVE_EMBED_(int, _t) nint_t;
+typedef NATIVE_EMBED_(uint, _t) nuint_t;
+typedef PHYSADDR_EMBED_(uint, _t) physaddr_t;
+
+#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS)
+# ifndef INT32_MAX
+# define INT8_MAX INT8_C (0x7f)
+# define INT8_MIN (-INT8_MAX-1)
+# define INT16_MAX INT16_C(0x7fff)
+# define INT16_MIN (-INT16_MAX-1)
+# define INT32_MAX INT32_C(0x7fffffff)
+# define INT32_MIN (-INT32_MAX-1)
+# define INT64_MAX INT64_C(0x7fffffffffffffff)
+# define INT64_MIN (-INT64_MAX-1)
+# endif
+# ifndef UINT32_MAX
+# define UINT8_MAX UINT8_C (0xff)
+# define UINT16_MAX UINT16_C(0xffff)
+# define UINT32_MAX UINT32_C(0xffffffff)
+# define UINT64_MAX UINT64_C(0xffffffffffffffff)
+# endif
+# define INTPTR_MIN POINTER_EMBED_(INT, _MIN)
+# define INTPTR_MAX POINTER_EMBED_(INT, _MAX)
+# define UINTPTR_MAX POINTER_EMBED_(UINT, _MAX)
+# define NINT_MIN NATIVE_EMBED_(INT, _MIN)
+# define NINT_MAX NATIVE_EMBED_(INT, _MAX)
+# define NUINT_MAX NATIVE_EMBED_(UINT, _MAX)
+# define PHYSADDR_MAX PHYSADDR_EMBED_(UINT, _MAX)
+#endif
+
+#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS)
+# ifndef INT32_C
+# define INT8_C(n) (n)
+# define INT16_C(n) (n)
+# define INT32_C(n) (n)
+# define INT64_C(n) (n##LL)
+# endif
+# ifndef UINT32_C
+# define UINT8_C(n) (n)
+# define UINT16_C(n) (n)
+# define UINT32_C(n) (n##U)
+# define UINT64_C(n) (n##ULL)
+# endif
+# define INTPTR_C POINTER_EMBED_(INT, _C)
+# define UINTPTR_C POINTER_EMBED_(UINT, _C)
+# define NINT_C NATIVE_EMBED_(INT, _C)
+# define NUINT_C NATIVE_EMBED_(UINT, _C)
+# define PHYSADDR_C PHYSADDR_EMBED_(UINT, _C)
+#endif
+
+#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)
+# ifndef PRId32
+# define PRI_8(t) #t
+# define PRId8 PRI_8(d)
+# define PRIi8 PRI_8(i)
+# define PRIo8 PRI_8(o)
+# define PRIu8 PRI_8(u)
+# define PRIx8 PRI_8(x)
+# define PRIX8 PRI_8(X)
+
+# define PRI_16(t) #t
+# define PRId16 PRI_16(d)
+# define PRIi16 PRI_16(i)
+# define PRIo16 PRI_16(o)
+# define PRIu16 PRI_16(u)
+# define PRIx16 PRI_16(x)
+# define PRIX16 PRI_16(X)
+
+# define PRI_32(t) #t
+# define PRId32 PRI_32(d)
+# define PRIi32 PRI_32(i)
+# define PRIo32 PRI_32(o)
+# define PRIu32 PRI_32(u)
+# define PRIx32 PRI_32(x)
+# define PRIX32 PRI_32(X)
+
+# define PRI_64(t) "L"#t
+# define PRId64 PRI_64(d)
+# define PRIi64 PRI_64(i)
+# define PRIo64 PRI_64(o)
+# define PRIu64 PRI_64(u)
+# define PRIx64 PRI_64(x)
+# define PRIX64 PRI_64(X)
+
+# endif
+# define NPRId NATIVE_APPEND_(PRId)
+# define NPRIi NATIVE_APPEND_(PRIi)
+# define NPRIo NATIVE_APPEND_(PRIo)
+# define NPRIu NATIVE_APPEND_(PRIu)
+# define NPRIx NATIVE_APPEND_(PRIx)
+# define NPRIX NATIVE_APPEND_(PRIX)
+# define NSCNd NATIVE_APPEND_(SCNd)
+# define NSCNi NATIVE_APPEND_(SCNi)
+# define NSCNo NATIVE_APPEND_(SCNo)
+# define NSCNu NATIVE_APPEND_(SCNu)
+# define NSCNx NATIVE_APPEND_(SCNx)
+# define PPRId PHYSADDR_APPEND_(PRId)
+# define PPRIi PHYSADDR_APPEND_(PRIi)
+# define PPRIo PHYSADDR_APPEND_(PRIo)
+# define PPRIu PHYSADDR_APPEND_(PRIu)
+# define PPRIx PHYSADDR_APPEND_(PRIx)
+# define PPRIX PHYSADDR_APPEND_(PRIX)
+# define PSCNd PHYSADDR_APPEND_(SCNd)
+# define PSCNi PHYSADDR_APPEND_(SCNi)
+# define PSCNo PHYSADDR_APPEND_(SCNo)
+# define PSCNu PHYSADDR_APPEND_(SCNu)
+# define PSCNx PHYSADDR_APPEND_(SCNx)
+#endif
+
+#define GETPTR(addr) POINTER_APPEND_(GET)(addr)
+#define PUTPTR(n, addr) POINTER_APPEND_(PUT)(n, addr)
+#define GETN(addr) NATIVE_APPEND_(GET)(addr)
+#define PUTN(n, addr) NATIVE_APPEND_(PUT)(n, addr)
+#define GETPHYS(addr) PHYSADDR_APPEND_(GET)(addr)
+#define PUTPHYS(pa, addr) PHYSADDR_APPEND_(PUT)(pa, addr)
+
+/*
+ * Define a type suitable for forcing 128-bit (16-byte) structure alignment
+ */
+#if defined(__INTEL_COMPILER)
+
+typedef long long __m128;
+typedef __m128 align128_t;
+
+#elif defined(__ECL)
+
+typedef __int128 align128_t;
+
+#elif defined(__GNUC__)
+
+typedef struct {
+ char _;
+} align128_t __attribute__((__aligned__(16)));
+
+#endif
+
+typedef union {
+#if defined(_M_IA64) || defined(__ia64__)
+ align128_t fp128;
+#endif
+ struct {
+ uint64_t loflt;
+ uint64_t hiflt;
+ } real_fp;
+} float128_t;
+
+#endif /* _LINUX_NINT_H */
Index: 2.6.14-nlkd/include/linux/nlkd.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ 2.6.14-nlkd/include/linux/nlkd.h 2005-11-03 12:04:12.000000000 +0100
@@ -0,0 +1,241 @@
+/*****************************************************************************
+ *
+ * File Name: nlkd.h
+ * Created by: Jan Beulich
+ * %version: 17 %
+ * %derived_by: jbeulich %
+ * %date_modified: Thu Nov 03 04:03:57 2005 %
+ *
+ *****************************************************************************/
+/*****************************************************************************
+ * *
+ * Copyright (c) 1999-2005 Novell, Inc. All Rights Reserved. *
+ * *
+ * This program is free software; you can redistribute it and/or *
+ * modify it under the terms of version 2 of the GNU General Public License *
+ * as published by the Free Software Foundation. *
+ * *
+ * 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. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, contact Novell, Inc. *
+ * *
+ * To contact Novell about this file by physical or electronic mail, *
+ * you may find current contact information at www.novell.com. *
+ * *
+ *****************************************************************************/
+/*****************************************************************************
+ *
+ * File Description:
+ *
+ *****************************************************************************/
+
+#include <linux/config.h>
+
+#ifndef DEBUG_EVENT_ENTER_DEBUGGER
+# define DEBUG_EVENT_ENTER_DEBUGGER 0
+
+/* negative values are error conditions */
+# define DEBUG_EVENT_PANIC (-1)
+# define DEBUG_EVENT_ASSERT (-2)
+
+/* positive values are informational */
+# define DEBUG_EVENT_MESSAGE 1
+# define DEBUG_EVENT_MODULE_LOAD 2
+# define DEBUG_EVENT_MODULE_UNLOAD 3
+# define DEBUG_EVENT_THREAD_CREATE 4
+# define DEBUG_EVENT_THREAD_DESTROY 5
+
+# ifndef __ASSEMBLY__
+# ifdef CONFIG_NLKD
+
+# include <linux/linkage.h>
+# include <linux/compiler.h>
+
+asmlinkage void nlkdAssert(const char*string,
+ const char*file,
+ const char*func,
+ unsigned line);
+asmlinkage void nlkdDebugEvent(int eventCode, ...);
+asmlinkage void nlkdEnterDebugger(void);
+asmlinkage void nlkdPanic(const char*, ...);
+struct ftaInterruptionCtx_s;
+int nlkdIsDebugEvent(const struct ftaInterruptionCtx_s*);
+# ifndef CONFIG_NLKD_FTA
+void nlkdSetDebugEventType(struct ftaInterruptionCtx_s*);
+# endif
+
+# if defined(__GNUC__)
+# define rtASSERT(e) ((void)(likely(e) || (nlkdAssert(#e, __FILE__, __PRETTY_FUNCTION__, __LINE__), 0)))
+# elif __STDC_VERSION__ >= 199901L
+# define rtASSERT(e) ((void)(likely(e) || (nlkdAssert(#e, __FILE__, __func__, __LINE__), 0)))
+# else
+# define rtASSERT(e) ((void)(likely(e) || (nlkdAssert(#e, __FILE__, NULL, __LINE__), 0)))
+# endif
+
+# else /* CONFIG_NLKD */
+
+# include <linux/kernel.h>
+
+static inline void nlkdDebugEvent(int eventCode, ...) {}
+# define nlkdPanic panic
+
+# endif /* CONFIG_NLKD */
+# endif /* !__ASSEMBLY__ */
+#endif /* DEBUG_EVENT_xxx */
+
+#ifndef _LINUX_NLKD_H
+#define _LINUX_NLKD_H
+# ifndef __ASSEMBLY__
+
+# ifdef CONFIG_NLKD
+
+# include <linux/module-id.h>
+# include <linux/nint.h>
+# include <linux/lstatus.h>
+# include <stdarg.h>
+
+void nlkd_init(void);
+void nlkd_init_done(void);
+
+# define NLKD_EXT_ID_MAX 32
+
+typedef void nlkdExtHandler_t(void*context, const char*command);
+
+void nlkdExtInputString(char*buffer, nuint_t bufferSize);
+void nlkdExtOutputString(const char*);
+int nlkdExtPrintf(const char*, ...) __attribute__((__format__(__printf__, 1, 2)));
+LSTATUS nlkdExtRegister(const char*id,
+ nlkdExtHandler_t*,
+ void*handlerContext,
+ moduleId_t,
+ const char*description,
+ nuint_t flags);
+LSTATUS nlkdExtUnregister(const char*id, moduleId_t);
+int nlkdExtVprintf(const char*, va_list);
+
+# ifndef MODULE
+/* For code needing no initialization (e.g. printk), provide a way to store
+ the handler information without the need to call nlkdExtRegister(). */
+typedef const struct {
+ const char*id;
+ nlkdExtHandler_t*handler;
+ void*handlerContext;
+ const moduleId_t*pModuleId;
+ const char*description;
+ nuint_t flags;
+} nlkdExtension_t;
+# define NLKD_EXTENSION(id, handler, ctx, mod, descr, flg) \
+ static nlkdExtension_t __nlkd_ext_##id \
+ __attribute__((__section__(".nlkd.ext"))) \
+ __attribute__((__aligned__(sizeof(void*)))) \
+ __attribute_used__ = { \
+ #id, handler, ctx, &mod, descr, flg \
+ }
+# endif
+
+struct pt_regs;
+struct cdeBPStruct_s;
+
+# ifdef CONFIG_CDE
+# define MAYBE_INDIR(x) cdeBP##x
+# else
+# define MAYBE_INDIR(x) (*x)
+extern struct nlkdBPXface_s {
+# endif
+
+/*
+ *
+ */
+void MAYBE_INDIR(Load)(
+ void);
+
+/*
+ *
+ */
+void MAYBE_INDIR(EnvClearAll)(
+ struct cdeBPStruct_s * * bpHead);
+
+/*
+ *
+ */
+void MAYBE_INDIR(EnvDisableAll)(
+ const struct cdeBPStruct_s * const * bpHead);
+
+/*
+ *
+ */
+void MAYBE_INDIR(EnvEnableAll)(
+ const struct cdeBPStruct_s * const * bpHead);
+
+/*
+ *
+ */
+int MAYBE_INDIR(EnvCheckAll)(
+ const struct pt_regs *,
+ const struct cdeBPStruct_s * const * bpHead);
+
+# undef MAYBE_INDIR
+# ifndef CONFIG_CDE
+} const * nlkdBPXface;
+# endif
+
+# else
+
+# define nlkd_init()
+# define nlkd_init_done()
+
+# endif
+
+# ifndef bp_list_handle
+# if defined(CONFIG_CDE)
+# define bp_list_handle(what, cond, obj) ((cond) \
+ ? cdeBPEnv##what##All(&(obj)->bpList) \
+ : (void)(obj))
+# define bp_list_clear(obj) bp_list_handle(Clear, (obj)->bpList, obj)
+# define bp_list_check(regs, obj) ((obj)->bpList \
+ ? cdeBPEnvCheckAll(regs, &(obj)->bpList) \
+ : ((void)(regs), (void)(obj), -1))
+# define bp_load() cdeBPLoad()
+# elif defined(CONFIG_NLKD)
+# define bp_list_handle(what, cond, obj) ((cond) && nlkdBPXface \
+ ? nlkdBPXface->Env##what##All(&(obj)->bpList) \
+ : (void)(obj))
+# define bp_list_clear(obj) bp_list_handle(Clear, (obj)->bpList, obj)
+# define bp_list_check(regs, obj) ((obj)->bpList && nlkdBPXface \
+ ? nlkdBPXface->EnvCheckAll(regs, &(obj)->bpList) \
+ : ((void)(regs), (void)(obj), 0))
+# define bp_load() (nlkdBPXface ? nlkdBPXface->Load() : (void)0)
+# else
+# define bp_list_handle(what, cond, obj) ((void)(cond), (void)(obj))
+# define bp_list_clear(obj) ((void)(obj))
+# define bp_list_check(regs, obj) ((void)(regs), (void)(obj), -1)
+# define bp_load() ((void)0)
+# endif
+# define bp_list_disable(cond, obj) bp_list_handle(Disable, cond, obj)
+# define bp_list_enable(cond, obj) bp_list_handle(Enable, cond, obj)
+# endif
+
+# define ctASSERT_GLUE(x, y) x##y
+# define ctASSERT_NAME(tag) ctASSERT_GLUE(_ctassert_, tag)
+# define CTASSERT_DECL(e) struct ctASSERT_NAME(__LINE__) {unsigned _:!!(e);}
+# define CTASSERT_TYPED_EXPR(t, e) ((t)sizeof(char[1 - 2 * !(e)]))
+# define CTASSERT_EXPR(e) CTASSERT_TYPED_EXPR(void, e)
+
+# endif /* __ASSEMBLY__ */
+#endif /* _LINUX_NLKD_H */
+
+#undef RTASSERT
+#undef RTVERIFY
+#ifndef __ASSEMBLY__
+# if !defined(CONFIG_NLKD) || !defined(CONFIG_DEBUG_KERNEL) || defined(NDEBUG)
+# define RTASSERT(e) ((void)0)
+# define RTVERIFY(e) ((void)(e))
+# else
+# define RTASSERT rtASSERT
+# define RTVERIFY rtASSERT
+# endif
+#endif /* !__ASSEMBLY__ */
next prev parent reply other threads:[~2005-11-09 14:18 UTC|newest]
Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-11-09 13:54 [PATCH 0/39] NLKD - Novell Linux Kernel Debugger Jan Beulich
2005-11-09 13:56 ` [PATCH 1/39] NLKD - an alternative kallsyms approach Jan Beulich
2005-11-09 13:57 ` [PATCH 2/39] NLKD - an alternative early ioremap approach Jan Beulich
2005-11-09 13:58 ` [PATCH 3/39] NLKD - early/late CPU up/down notification Jan Beulich
2005-11-09 13:59 ` [PATCH 4/39] NLKD/i386 " Jan Beulich
2005-11-09 14:01 ` [PATCH 5/39] NLKD/x86-64 " Jan Beulich
2005-11-10 13:10 ` Andi Kleen
2005-11-14 8:04 ` [discuss] " Jan Beulich
2005-11-14 12:37 ` Andi Kleen
2005-11-09 14:01 ` [PATCH 6/39] NLKD - early panic notification Jan Beulich
2005-11-09 14:02 ` [PATCH 7/39] NLKD - task create/destroy notification Jan Beulich
2005-11-09 14:03 ` [PATCH 8/39] NLKD - rmmod notification Jan Beulich
2005-11-09 14:04 ` [PATCH 9/39] NLKD - hotkey notification Jan Beulich
2005-11-09 14:05 ` [PATCH 10/39] NLKD - console layout change notification Jan Beulich
2005-11-09 14:06 ` [PATCH 11/39] NLKD - time adjustment Jan Beulich
2005-11-09 14:06 ` [PATCH 12/39] NLKD/i386 " Jan Beulich
2005-11-09 19:10 ` George Anzinger
2005-11-10 8:12 ` Jan Beulich
2005-11-11 0:17 ` George Anzinger
2005-11-09 14:08 ` [PATCH 13/39] NLKD/x86-64 " Jan Beulich
2005-11-09 14:13 ` [PATCH 18/39] NLKD/x86-64 - INT1/INT3 handling changes Jan Beulich
2005-11-09 14:14 ` [PATCH 19/39] NLKD/x86-64 - stack-pointer-invalid markers Jan Beulich
2005-11-09 14:15 ` [PATCH 20/39] NLKD/x86-64 - switch_to() floating point adjustment Jan Beulich
2005-11-09 14:16 ` [PATCH 21/39] NLKD/x86-64 - core adjustments Jan Beulich
2005-11-10 13:24 ` [PATCH 20/39] NLKD/x86-64 - switch_to() floating point adjustment Andi Kleen
2005-11-10 14:07 ` Jan Beulich
2005-11-10 13:23 ` [PATCH 19/39] NLKD/x86-64 - stack-pointer-invalid markers Andi Kleen
2005-11-10 14:25 ` Jan Beulich
2005-11-10 13:21 ` [PATCH 18/39] NLKD/x86-64 - INT1/INT3 handling changes Andi Kleen
2005-11-10 14:07 ` Jan Beulich
2005-11-10 14:25 ` Andi Kleen
2005-11-10 15:00 ` Jan Beulich
2005-11-11 3:39 ` [discuss] " Andi Kleen
2005-11-10 13:19 ` [PATCH 13/39] NLKD/x86-64 - time adjustment Andi Kleen
2005-11-10 14:23 ` Jan Beulich
2005-11-11 2:12 ` Andi Kleen
2005-11-12 9:22 ` Vojtech Pavlik
2005-11-12 17:21 ` Andi Kleen
2005-11-12 20:44 ` Vojtech Pavlik
2005-11-15 0:38 ` George Anzinger
2005-11-15 1:05 ` [discuss] " Andi Kleen
2005-11-15 7:50 ` Vojtech Pavlik
2005-11-15 8:24 ` Jan Beulich
2005-11-10 14:43 ` Vojtech Pavlik
2005-11-09 14:09 ` [PATCH 14/39] NLKD - kernel trace buffer access Jan Beulich
2005-11-09 14:09 ` [PATCH 15/39] NLKD - early pseudo-fs Jan Beulich
2005-11-09 14:11 ` [PATCH 16/39] NLKD - core adjustments Jan Beulich
2005-11-09 14:11 ` [PATCH 17/39] NLKD/i386 " Jan Beulich
2005-11-09 19:00 ` Adrian Bunk
2005-11-10 8:04 ` Jan Beulich
2005-11-10 10:29 ` Adrian Bunk
2005-11-10 11:52 ` Jan Beulich
2005-11-10 12:36 ` Lars Marowsky-Bree
2005-11-09 14:18 ` Jan Beulich [this message]
2005-11-09 14:19 ` [PATCH 23/39] NLKD/x86 - core Jan Beulich
2005-11-09 14:20 ` [PATCH 24/39] NLKD/i386 " Jan Beulich
2005-11-09 14:21 ` [PATCH 25/39] NLKD/x86-64 " Jan Beulich
2005-11-10 13:30 ` Andi Kleen
2005-11-09 14:22 ` [PATCH 26/39] NLKD - run time library Jan Beulich
2005-11-09 14:23 ` [PATCH 27/39] NLKD/i386 " Jan Beulich
2005-11-09 14:23 ` [PATCH 28/39] NLKD/x86-64 " Jan Beulich
2005-11-10 13:32 ` Andi Kleen
[not found] ` <437214B7.76F0.0078.0@novell.com>
[not found] ` <4372156A.76F0.0078.0@novell.com>
2005-11-09 14:28 ` [PATCH 34/39] NLKD/x86 - Console Debug Agent Jan Beulich
[not found] ` <43721600.76F0.0078.0@novell.com>
2005-11-09 14:30 ` [PATCH 38/39] NLKD/i386 - Remote " Jan Beulich
2005-11-09 14:31 ` [PATCH 39/39] NLKD/x86-64 " Jan Beulich
2005-11-09 14:29 ` [PATCH 15/39] NLKD - early pseudo-fs Al Viro
2005-11-09 14:37 ` Jan Beulich
2005-11-09 15:00 ` Al Viro
2005-11-09 16:00 ` Jan Beulich
2005-11-10 5:44 ` [PATCH 14/39] NLKD - kernel trace buffer access Keith Owens
2005-11-10 8:02 ` Jan Beulich
2005-11-09 18:51 ` [PATCH 11/39] NLKD - time adjustment George Anzinger
2005-11-09 16:50 ` [PATCH 6/39] NLKD - early panic notification Greg KH
2005-11-09 16:45 ` [PATCH 3/39] NLKD - early/late CPU up/down notification Greg KH
2005-11-09 17:09 ` Jan Beulich
2005-11-09 17:19 ` Greg KH
2005-11-10 7:41 ` Jan Beulich
2005-11-10 20:59 ` Sam Ravnborg
2005-11-11 7:52 ` Jan Beulich
2005-11-12 20:52 ` Randy.Dunlap
2005-11-10 23:01 ` Greg KH
2005-11-11 10:06 ` [PATCH 2/39] NLKD - an alternative early ioremap approach Pavel Machek
2005-11-11 10:19 ` Jan Beulich
2005-11-09 16:50 ` [PATCH 1/39] NLKD - an alternative kallsyms approach Randy.Dunlap
2005-11-09 16:57 ` Greg KH
2005-11-09 17:20 ` Jan Beulich
2005-11-09 16:59 ` [PATCH 0/39] NLKD - Novell Linux Kernel Debugger Jeff Garzik
2005-11-09 17:06 ` Randy.Dunlap
2005-11-09 17:14 ` Jan Beulich
2005-11-09 17:56 ` Alan Cox
2005-11-09 18:05 ` Greg KH
2005-11-09 18:54 ` Paul Jackson
2005-11-10 12:41 ` Christoph Hellwig
2005-11-13 1:09 ` Andi Kleen
2005-11-13 2:53 ` jmerkey
2005-11-13 3:44 ` Andi Kleen
2005-11-13 3:26 ` Jeff V. Merkey
2005-11-13 3:32 ` Jeff V. Merkey
2005-11-09 17:53 ` Alan Cox
2005-11-09 16:25 ` Jeffrey V. Merkey
2005-11-10 14:48 ` Mark Lord
2005-11-10 15:28 ` Tom Rini
2005-11-10 16:37 ` Alan Cox
2005-11-13 1:11 ` Andi Kleen
[not found] ` <437214E4.76F0.0078.0@novell.com>
[not found] ` <4372153C.76F0.0078.0@novell.com>
2005-11-10 13:33 ` [PATCH 32/39] NLKD/x86-64 - Core Debug Engine Andi Kleen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4372135F.76F0.0078.0@novell.com \
--to=jbeulich@novell.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox