162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * kdebug.h: Defines and definitions for debugging the Linux kernel 462306a36Sopenharmony_ci * under various kernel debuggers. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci#ifndef _SPARC_KDEBUG_H 962306a36Sopenharmony_ci#define _SPARC_KDEBUG_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <asm/openprom.h> 1262306a36Sopenharmony_ci#include <asm/vaddrs.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* Breakpoints are enter through trap table entry 126. So in sparc assembly 1562306a36Sopenharmony_ci * if you want to drop into the debugger you do: 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * t DEBUG_BP_TRAP 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define DEBUG_BP_TRAP 126 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 2362306a36Sopenharmony_ci/* The debug vector is passed in %o1 at boot time. It is a pointer to 2462306a36Sopenharmony_ci * a structure in the debuggers address space. Here is its format. 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_citypedef unsigned int (*debugger_funct)(void); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistruct kernel_debug { 3062306a36Sopenharmony_ci /* First the entry point into the debugger. You jump here 3162306a36Sopenharmony_ci * to give control over to the debugger. 3262306a36Sopenharmony_ci */ 3362306a36Sopenharmony_ci unsigned long kdebug_entry; 3462306a36Sopenharmony_ci unsigned long kdebug_trapme; /* Figure out later... */ 3562306a36Sopenharmony_ci /* The following is the number of pages that the debugger has 3662306a36Sopenharmony_ci * taken from to total pool. 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_ci unsigned long *kdebug_stolen_pages; 3962306a36Sopenharmony_ci /* Ok, after you remap yourself and/or change the trap table 4062306a36Sopenharmony_ci * from what you were left with at boot time you have to call 4162306a36Sopenharmony_ci * this synchronization function so the debugger can check out 4262306a36Sopenharmony_ci * what you have done. 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_ci debugger_funct teach_debugger; 4562306a36Sopenharmony_ci}; /* I think that is it... */ 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ciextern struct kernel_debug *linux_dbvec; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* Use this macro in C-code to enter the debugger. */ 5062306a36Sopenharmony_cistatic inline void sp_enter_debugger(void) 5162306a36Sopenharmony_ci{ 5262306a36Sopenharmony_ci __asm__ __volatile__("jmpl %0, %%o7\n\t" 5362306a36Sopenharmony_ci "nop\n\t" : : 5462306a36Sopenharmony_ci "r" (linux_dbvec) : "o7", "memory"); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define SP_ENTER_DEBUGGER do { \ 5862306a36Sopenharmony_ci if((linux_dbvec!=0) && ((*(short *)linux_dbvec)!=-1)) \ 5962306a36Sopenharmony_ci sp_enter_debugger(); \ 6062306a36Sopenharmony_ci } while(0) 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cienum die_val { 6362306a36Sopenharmony_ci DIE_UNUSED, 6462306a36Sopenharmony_ci DIE_OOPS, 6562306a36Sopenharmony_ci}; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#endif /* !(__ASSEMBLY__) */ 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* Some nice offset defines for assembler code. */ 7062306a36Sopenharmony_ci#define KDEBUG_ENTRY_OFF 0x0 7162306a36Sopenharmony_ci#define KDEBUG_DUNNO_OFF 0x4 7262306a36Sopenharmony_ci#define KDEBUG_DUNNO2_OFF 0x8 7362306a36Sopenharmony_ci#define KDEBUG_TEACH_OFF 0xc 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#endif /* !(_SPARC_KDEBUG_H) */ 76