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…
Reference in a new issue