mirror of
				https://gitlab.com/sortix/sortix.git
				synced 2023-02-13 20:55:38 -05:00 
			
		
		
		
	Retire calltrace support in favor of the kernel debugger.
This commit is contained in:
		
							parent
							
								
									c24b5ee5a4
								
							
						
					
					
						commit
						35708fa900
					
				
					 14 changed files with 0 additions and 429 deletions
				
			
		| 
						 | 
					@ -5,7 +5,6 @@ include ../dirs.mak
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Default values in case the user doesn't override these variables.
 | 
					# Default values in case the user doesn't override these variables.
 | 
				
			||||||
OPTLEVEL?=$(DEFAULT_HOST_OPTLEVEL)
 | 
					OPTLEVEL?=$(DEFAULT_HOST_OPTLEVEL)
 | 
				
			||||||
CALLTRACE?=0
 | 
					 | 
				
			||||||
DISKWRITE?=1
 | 
					DISKWRITE?=1
 | 
				
			||||||
CPPFLAGS?=
 | 
					CPPFLAGS?=
 | 
				
			||||||
CXXFLAGS?=$(OPTLEVEL)
 | 
					CXXFLAGS?=$(OPTLEVEL)
 | 
				
			||||||
| 
						 | 
					@ -20,7 +19,6 @@ ifeq ($(PANIC_SHORT),1)
 | 
				
			||||||
    CPPFLAGS:=$(CPPFLAGS) -DPANIC_SHORT
 | 
					    CPPFLAGS:=$(CPPFLAGS) -DPANIC_SHORT
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
CPPFLAGS:=$(CPPFLAGS) -DENABLE_DISKWRITE=$(DISKWRITE)
 | 
					CPPFLAGS:=$(CPPFLAGS) -DENABLE_DISKWRITE=$(DISKWRITE)
 | 
				
			||||||
CPPFLAGS:=$(CPPFLAGS) -DENABLE_CALLTRACE=$(CALLTRACE)
 | 
					 | 
				
			||||||
ifdef VERSION
 | 
					ifdef VERSION
 | 
				
			||||||
    CPPFLAGS:=$(CPPFLAGS) -DVERSIONSTR=\"$(VERSION)\"
 | 
					    CPPFLAGS:=$(CPPFLAGS) -DVERSIONSTR=\"$(VERSION)\"
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
| 
						 | 
					@ -75,11 +73,9 @@ $(CPUOBJS) \
 | 
				
			||||||
addralloc.o \
 | 
					addralloc.o \
 | 
				
			||||||
alarm.o \
 | 
					alarm.o \
 | 
				
			||||||
ata.o \
 | 
					ata.o \
 | 
				
			||||||
calltrace.o \
 | 
					 | 
				
			||||||
clock.o \
 | 
					clock.o \
 | 
				
			||||||
com.o \
 | 
					com.o \
 | 
				
			||||||
copy.o \
 | 
					copy.o \
 | 
				
			||||||
$(CPU)/calltrace.o \
 | 
					 | 
				
			||||||
$(CPU)/kthread.o \
 | 
					$(CPU)/kthread.o \
 | 
				
			||||||
crc32.o \
 | 
					crc32.o \
 | 
				
			||||||
debugger.o \
 | 
					debugger.o \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,44 +0,0 @@
 | 
				
			||||||
/*******************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This file is part of Sortix.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Sortix 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 3 of the License, or (at your option) any later
 | 
					 | 
				
			||||||
    version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Sortix 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
 | 
					 | 
				
			||||||
    Sortix. If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    calltrace.cpp
 | 
					 | 
				
			||||||
    Traverses the stack and prints the callstack, which aids debugging.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*******************************************************************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <sortix/kernel/calltrace.h>
 | 
					 | 
				
			||||||
#include <sortix/kernel/kernel.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace Sortix {
 | 
					 | 
				
			||||||
namespace Calltrace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" void calltrace(unsigned long ptr);
 | 
					 | 
				
			||||||
extern "C" void calltrace_print_function(size_t index, addr_t ip)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	Log::PrintF("%zu: 0x%zx\n", index, ip);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Perform(unsigned long ptr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	Log::PrintF("Calltrace:\n");
 | 
					 | 
				
			||||||
	calltrace(ptr);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} // namespace Calltrace
 | 
					 | 
				
			||||||
} // namespace Sortix
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,36 +0,0 @@
 | 
				
			||||||
/*******************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This file is part of Sortix.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Sortix 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 3 of the License, or (at your option) any later
 | 
					 | 
				
			||||||
    version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Sortix 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
 | 
					 | 
				
			||||||
    Sortix. If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sortix/kernel/calltrace.h
 | 
					 | 
				
			||||||
    Traverses the stack and prints the callstack, which aids debugging.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*******************************************************************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef INCLUDE_SORTIX_KERNEL_CALLTRACE_H
 | 
					 | 
				
			||||||
#define INCLUDE_SORTIX_KERNEL_CALLTRACE_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace Sortix {
 | 
					 | 
				
			||||||
namespace Calltrace {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Perform(unsigned long ptr = 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} // namespace Calltrace
 | 
					 | 
				
			||||||
} // namespace Sortix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,6 @@
 | 
				
			||||||
#include <errno.h>
 | 
					#include <errno.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <sortix/kernel/calltrace.h>
 | 
					 | 
				
			||||||
#include <sortix/kernel/cpu.h>
 | 
					#include <sortix/kernel/cpu.h>
 | 
				
			||||||
#include <sortix/kernel/debugger.h>
 | 
					#include <sortix/kernel/debugger.h>
 | 
				
			||||||
#include <sortix/kernel/interrupt.h>
 | 
					#include <sortix/kernel/interrupt.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,6 @@
 | 
				
			||||||
#include <brand.h>
 | 
					#include <brand.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <sortix/kernel/calltrace.h>
 | 
					 | 
				
			||||||
#include <sortix/kernel/interrupt.h>
 | 
					#include <sortix/kernel/interrupt.h>
 | 
				
			||||||
#include <sortix/kernel/kernel.h>
 | 
					#include <sortix/kernel/kernel.h>
 | 
				
			||||||
#include <sortix/kernel/log.h>
 | 
					#include <sortix/kernel/log.h>
 | 
				
			||||||
| 
						 | 
					@ -116,18 +115,10 @@ void PanicInit()
 | 
				
			||||||
	longpanic ? PanicLogoLong() : PanicLogoShort();
 | 
						longpanic ? PanicLogoLong() : PanicLogoShort();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void PanicCalltrace()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	Log::Print("\n");
 | 
					 | 
				
			||||||
	Calltrace::Perform();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void PanicHooks()
 | 
					static void PanicHooks()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if ( doublepanic )
 | 
						if ( doublepanic )
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	if ( ENABLE_CALLTRACE )
 | 
					 | 
				
			||||||
		PanicCalltrace();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern "C" __attribute__((noreturn)) void Panic(const char* error)
 | 
					extern "C" __attribute__((noreturn)) void Panic(const char* error)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,57 +0,0 @@
 | 
				
			||||||
/*******************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This file is part of Sortix.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Sortix 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 3 of the License, or (at your option) any later
 | 
					 | 
				
			||||||
    version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Sortix 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
 | 
					 | 
				
			||||||
    Sortix. If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    x64/calltrace.S
 | 
					 | 
				
			||||||
    Attempts to unwind the stack and prints the code locations where functions
 | 
					 | 
				
			||||||
    were called. This greatly aids debugging.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*******************************************************************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.section .text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.global calltrace
 | 
					 | 
				
			||||||
.type calltrace, @function
 | 
					 | 
				
			||||||
calltrace:
 | 
					 | 
				
			||||||
	push %rbp
 | 
					 | 
				
			||||||
	push %rbx
 | 
					 | 
				
			||||||
	movq %rsp, %rbp
 | 
					 | 
				
			||||||
	push %rbx
 | 
					 | 
				
			||||||
	movq %rdi, %rbx
 | 
					 | 
				
			||||||
	testq %rbx, %rbx
 | 
					 | 
				
			||||||
	jnz 1f
 | 
					 | 
				
			||||||
	movq %rbp, %rbx
 | 
					 | 
				
			||||||
1:
 | 
					 | 
				
			||||||
	xorl %edi, %edi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
calltrace_unwind:
 | 
					 | 
				
			||||||
	testq %rbx, %rbx
 | 
					 | 
				
			||||||
	jz calltrace_done
 | 
					 | 
				
			||||||
	movq 8(%rbx), %rsi # Previous RIP
 | 
					 | 
				
			||||||
	movq 0(%rbx), %rbx # Previous RBP
 | 
					 | 
				
			||||||
	pushq %rdi
 | 
					 | 
				
			||||||
	call calltrace_print_function
 | 
					 | 
				
			||||||
	popq %rdi
 | 
					 | 
				
			||||||
	incq %rdi
 | 
					 | 
				
			||||||
	jmp calltrace_unwind
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
calltrace_done:
 | 
					 | 
				
			||||||
	popq %rbx
 | 
					 | 
				
			||||||
	popq %rbp
 | 
					 | 
				
			||||||
	retq
 | 
					 | 
				
			||||||
.size calltrace, . - calltrace
 | 
					 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,6 @@
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <sortix/kernel/calltrace.h>
 | 
					 | 
				
			||||||
#include <sortix/kernel/cpu.h>
 | 
					#include <sortix/kernel/cpu.h>
 | 
				
			||||||
#include <sortix/kernel/debugger.h>
 | 
					#include <sortix/kernel/debugger.h>
 | 
				
			||||||
#include <sortix/kernel/interrupt.h>
 | 
					#include <sortix/kernel/interrupt.h>
 | 
				
			||||||
| 
						 | 
					@ -104,8 +103,6 @@ namespace Interrupt {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern "C" { unsigned long asm_is_cpu_interrupted = 0; }
 | 
					extern "C" { unsigned long asm_is_cpu_interrupted = 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const bool CALLTRACE_KERNEL = false;
 | 
					 | 
				
			||||||
const bool CALLTRACE_USER = false;
 | 
					 | 
				
			||||||
const bool RUN_DEBUGGER_ON_KERNEL_CRASH = false;
 | 
					const bool RUN_DEBUGGER_ON_KERNEL_CRASH = false;
 | 
				
			||||||
const bool RUN_DEBUGGER_ON_USER_CRASH = false;
 | 
					const bool RUN_DEBUGGER_ON_USER_CRASH = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -260,26 +257,11 @@ uintptr_t ExceptionLocation(const struct interrupt_context* intctx)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CrashCalltrace(const struct interrupt_context* intctx)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#if defined(__x86_64__)
 | 
					 | 
				
			||||||
	Calltrace::Perform(intctx->rbp);
 | 
					 | 
				
			||||||
#elif defined(__i386__)
 | 
					 | 
				
			||||||
	Calltrace::Perform(intctx->ebp);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
	#warning "Please provide a calltrace implementation for your CPU."
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
__attribute__((noreturn))
 | 
					__attribute__((noreturn))
 | 
				
			||||||
void KernelCrashHandler(struct interrupt_context* intctx)
 | 
					void KernelCrashHandler(struct interrupt_context* intctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Scheduler::SaveInterruptedContext(intctx, &CurrentThread()->registers);
 | 
						Scheduler::SaveInterruptedContext(intctx, &CurrentThread()->registers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Walk and print the stack frames if this is a debug build.
 | 
					 | 
				
			||||||
	if ( CALLTRACE_KERNEL )
 | 
					 | 
				
			||||||
		CrashCalltrace(intctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Possibly switch to the kernel debugger in event of a crash.
 | 
						// Possibly switch to the kernel debugger in event of a crash.
 | 
				
			||||||
	if ( RUN_DEBUGGER_ON_KERNEL_CRASH )
 | 
						if ( RUN_DEBUGGER_ON_KERNEL_CRASH )
 | 
				
			||||||
		Debugger::Run(false);
 | 
							Debugger::Run(false);
 | 
				
			||||||
| 
						 | 
					@ -310,10 +292,6 @@ void UserCrashHandler(struct interrupt_context* intctx)
 | 
				
			||||||
			return Signal::DispatchHandler(intctx, NULL);
 | 
								return Signal::DispatchHandler(intctx, NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Walk and print the stack frames if this is a debug build.
 | 
					 | 
				
			||||||
	if ( CALLTRACE_USER )
 | 
					 | 
				
			||||||
		CrashCalltrace(intctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Possibly switch to the kernel debugger in event of a crash.
 | 
						// Possibly switch to the kernel debugger in event of a crash.
 | 
				
			||||||
	if ( RUN_DEBUGGER_ON_USER_CRASH )
 | 
						if ( RUN_DEBUGGER_ON_USER_CRASH )
 | 
				
			||||||
		Debugger::Run(false);
 | 
							Debugger::Run(false);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,59 +0,0 @@
 | 
				
			||||||
/*******************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Copyright(C) Jonas 'Sortie' Termansen 2012, 2013.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This file is part of Sortix.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Sortix 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 3 of the License, or (at your option) any later
 | 
					 | 
				
			||||||
    version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Sortix 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
 | 
					 | 
				
			||||||
    Sortix. If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    x86/calltrace.S
 | 
					 | 
				
			||||||
    Attempts to unwind the stack and prints the code locations where functions
 | 
					 | 
				
			||||||
    were called. This greatly aids debugging.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*******************************************************************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.section .text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.global calltrace
 | 
					 | 
				
			||||||
.type calltrace, @function
 | 
					 | 
				
			||||||
calltrace:
 | 
					 | 
				
			||||||
	push %ebp
 | 
					 | 
				
			||||||
	push %ebx
 | 
					 | 
				
			||||||
	movl %esp, %ebp
 | 
					 | 
				
			||||||
	push %ebx
 | 
					 | 
				
			||||||
	movl 8(%ebp), %ebx
 | 
					 | 
				
			||||||
	testl %ebx, %ebx
 | 
					 | 
				
			||||||
	jnz 1f
 | 
					 | 
				
			||||||
	movl %ebp, %ebx
 | 
					 | 
				
			||||||
1:
 | 
					 | 
				
			||||||
	xorl %edi, %edi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
calltrace_unwind:
 | 
					 | 
				
			||||||
	testl %ebx, %ebx
 | 
					 | 
				
			||||||
	jz calltrace_done
 | 
					 | 
				
			||||||
	movl 4(%ebx), %esi # Previous EIP
 | 
					 | 
				
			||||||
	movl 0(%ebx), %ebx # Previous EBP
 | 
					 | 
				
			||||||
	pushl %esi
 | 
					 | 
				
			||||||
	pushl %edi
 | 
					 | 
				
			||||||
	call calltrace_print_function
 | 
					 | 
				
			||||||
	popl %edi
 | 
					 | 
				
			||||||
	addl $4, %esp
 | 
					 | 
				
			||||||
	incl %edi
 | 
					 | 
				
			||||||
	jmp calltrace_unwind
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
calltrace_done:
 | 
					 | 
				
			||||||
	popl %ebx
 | 
					 | 
				
			||||||
	popl %ebp
 | 
					 | 
				
			||||||
	retl
 | 
					 | 
				
			||||||
.size calltrace, . - calltrace
 | 
					 | 
				
			||||||
| 
						 | 
					@ -313,8 +313,6 @@ arpa/inet/inet_addr.o \
 | 
				
			||||||
arpa/inet/inet_ntoa.o \
 | 
					arpa/inet/inet_ntoa.o \
 | 
				
			||||||
arpa/inet/inet_ntop.o \
 | 
					arpa/inet/inet_ntop.o \
 | 
				
			||||||
arpa/inet/inet_pton.o \
 | 
					arpa/inet/inet_pton.o \
 | 
				
			||||||
calltrace/calltrace.o \
 | 
					 | 
				
			||||||
$(CPUDIR)/calltrace.o \
 | 
					 | 
				
			||||||
$(CPUDIR)/fork.o \
 | 
					$(CPUDIR)/fork.o \
 | 
				
			||||||
$(CPUDIR)/setjmp.o \
 | 
					$(CPUDIR)/setjmp.o \
 | 
				
			||||||
$(CPUDIR)/signal.o \
 | 
					$(CPUDIR)/signal.o \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,44 +0,0 @@
 | 
				
			||||||
/*******************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Copyright(C) Jonas 'Sortie' Termansen 2012.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This file is part of the Sortix C Library.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    The Sortix C Library is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
    it under the terms of the GNU Lesser General Public License as published by
 | 
					 | 
				
			||||||
    the Free Software Foundation, either version 3 of the License, or (at your
 | 
					 | 
				
			||||||
    option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    The Sortix 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 Lesser General Public
 | 
					 | 
				
			||||||
    License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
    along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    calltrace/calltrace.cpp
 | 
					 | 
				
			||||||
    Traverses the stack and prints the callstack.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*******************************************************************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <calltrace.h>
 | 
					 | 
				
			||||||
#include <errno.h>
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
#include <unistd.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" void asm_calltrace();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" void calltrace_print_function(size_t index, unsigned long ip)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	fprintf(stdout, "[pid=%ji %s] %zu: 0x%lx\n", (intmax_t) getpid(),
 | 
					 | 
				
			||||||
	        program_invocation_short_name, index, ip);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern "C" void calltrace()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	fprintf(stdout, "[pid=%ji %s] Calltrace: (%s)\n", (intmax_t) getpid(),
 | 
					 | 
				
			||||||
	        program_invocation_short_name, program_invocation_name);
 | 
					 | 
				
			||||||
	asm_calltrace();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,36 +0,0 @@
 | 
				
			||||||
/*******************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Copyright(C) Jonas 'Sortie' Termansen 2012.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This file is part of the Sortix C Library.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    The Sortix C Library is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
    it under the terms of the GNU Lesser General Public License as published by
 | 
					 | 
				
			||||||
    the Free Software Foundation, either version 3 of the License, or (at your
 | 
					 | 
				
			||||||
    option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    The Sortix 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 Lesser General Public
 | 
					 | 
				
			||||||
    License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
    along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    calltrace.h
 | 
					 | 
				
			||||||
    Traverses the stack and prints the callstack.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*******************************************************************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef _CALLTRACE_H
 | 
					 | 
				
			||||||
#define _CALLTRACE_H 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <sys/cdefs.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
__BEGIN_DECLS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void calltrace();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
__END_DECLS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,6 @@
 | 
				
			||||||
#include <sys/stat.h>
 | 
					#include <sys/stat.h>
 | 
				
			||||||
#include <sys/wait.h>
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <calltrace.h>
 | 
					 | 
				
			||||||
#include <signal.h>
 | 
					#include <signal.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
| 
						 | 
					@ -44,12 +43,6 @@ extern "C" void abort(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern "C" void abort(void)
 | 
					extern "C" void abort(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct stat st;
 | 
					 | 
				
			||||||
	if ( stat("/etc/calltrace", &st) == 0 )
 | 
					 | 
				
			||||||
		calltrace();
 | 
					 | 
				
			||||||
	if ( stat("/etc/calltrace_loop", &st) == 0 )
 | 
					 | 
				
			||||||
		while ( true );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sigset_t set_of_sigabrt;
 | 
						sigset_t set_of_sigabrt;
 | 
				
			||||||
	sigemptyset(&set_of_sigabrt);
 | 
						sigemptyset(&set_of_sigabrt);
 | 
				
			||||||
	sigaddset(&set_of_sigabrt, SIGABRT);
 | 
						sigaddset(&set_of_sigabrt, SIGABRT);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,53 +0,0 @@
 | 
				
			||||||
/*******************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Copyright(C) Jonas 'Sortie' Termansen 2011, 2012, 2013.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This file is part of the Sortix C Library.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    The Sortix C Library is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
    it under the terms of the GNU Lesser General Public License as published by
 | 
					 | 
				
			||||||
    the Free Software Foundation, either version 3 of the License, or (at your
 | 
					 | 
				
			||||||
    option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    The Sortix 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 Lesser General Public
 | 
					 | 
				
			||||||
    License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
    along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    x64/calltrace.S
 | 
					 | 
				
			||||||
    Attempts to unwind the stack and prints the code locations where functions
 | 
					 | 
				
			||||||
    were called. This greatly aids debugging.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*******************************************************************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.global asm_calltrace
 | 
					 | 
				
			||||||
.type asm_calltrace, @function
 | 
					 | 
				
			||||||
asm_calltrace:
 | 
					 | 
				
			||||||
	push %rbp
 | 
					 | 
				
			||||||
	mov %rsp, %rbp
 | 
					 | 
				
			||||||
	push %rbx
 | 
					 | 
				
			||||||
	push %r12
 | 
					 | 
				
			||||||
	xor %r12, %r12
 | 
					 | 
				
			||||||
	mov %rbp, %rbx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lasm_calltrace_unwind:
 | 
					 | 
				
			||||||
	test %rbx, %rbx
 | 
					 | 
				
			||||||
	jz .Lasm_calltrace_done
 | 
					 | 
				
			||||||
	mov 8(%rbx), %rsi # Previous RIP
 | 
					 | 
				
			||||||
	mov 0(%rbx), %rbx # Previous RBP
 | 
					 | 
				
			||||||
	test %rsi, %rsi
 | 
					 | 
				
			||||||
	jz .Lasm_calltrace_done
 | 
					 | 
				
			||||||
	mov %r12, %rdi
 | 
					 | 
				
			||||||
	call calltrace_print_function
 | 
					 | 
				
			||||||
	inc %r12
 | 
					 | 
				
			||||||
	jmp .Lasm_calltrace_unwind
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lasm_calltrace_done:
 | 
					 | 
				
			||||||
	pop %r12
 | 
					 | 
				
			||||||
	pop %rbx
 | 
					 | 
				
			||||||
	pop %rbp
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
.size asm_calltrace, . - asm_calltrace
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,55 +0,0 @@
 | 
				
			||||||
/*******************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Copyright(C) Jonas 'Sortie' Termansen 2011, 2012, 2013.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This file is part of the Sortix C Library.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    The Sortix C Library is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
    it under the terms of the GNU Lesser General Public License as published by
 | 
					 | 
				
			||||||
    the Free Software Foundation, either version 3 of the License, or (at your
 | 
					 | 
				
			||||||
    option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    The Sortix 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 Lesser General Public
 | 
					 | 
				
			||||||
    License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
    along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    x86/calltrace.S
 | 
					 | 
				
			||||||
    Attempts to unwind the stack and prints the code locations where functions
 | 
					 | 
				
			||||||
    were called. This greatly aids debugging.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*******************************************************************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.global asm_calltrace
 | 
					 | 
				
			||||||
.type asm_calltrace, @function
 | 
					 | 
				
			||||||
asm_calltrace:
 | 
					 | 
				
			||||||
	push %ebp
 | 
					 | 
				
			||||||
	mov %esp, %ebp
 | 
					 | 
				
			||||||
	push %ebx
 | 
					 | 
				
			||||||
	push %esi
 | 
					 | 
				
			||||||
	xor %esi, %esi
 | 
					 | 
				
			||||||
	mov %ebp, %ebx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lasm_calltrace_unwind:
 | 
					 | 
				
			||||||
	test %ebx, %ebx
 | 
					 | 
				
			||||||
	jz .Lasm_calltrace_done
 | 
					 | 
				
			||||||
	mov 4(%ebx), %ecx # Previous EIP
 | 
					 | 
				
			||||||
	mov 0(%ebx), %ebx # Previous EBP
 | 
					 | 
				
			||||||
	test %ecx, %ecx
 | 
					 | 
				
			||||||
	jz .Lasm_calltrace_done
 | 
					 | 
				
			||||||
	push %ecx
 | 
					 | 
				
			||||||
	push %esi
 | 
					 | 
				
			||||||
	call calltrace_print_function
 | 
					 | 
				
			||||||
	add $8, %esp
 | 
					 | 
				
			||||||
	inc %esi
 | 
					 | 
				
			||||||
	jmp .Lasm_calltrace_unwind
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lasm_calltrace_done:
 | 
					 | 
				
			||||||
	pop %esi
 | 
					 | 
				
			||||||
	pop %ebx
 | 
					 | 
				
			||||||
	pop %ebp
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
.size asm_calltrace, . - asm_calltrace
 | 
					 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue