Merge pull request #639 from mrajwa/gdb_support

GDB: Initial commit - added debug vector and init code.
This commit is contained in:
Liam Girdwood 2018-11-28 14:46:11 +00:00 committed by GitHub
commit 70928de483
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 139 additions and 23 deletions

View File

@ -83,6 +83,12 @@ if test "$have_roms" = "yes"; then
AC_DEFINE([CONFIG_ENABLE_ROMS], [1], [Enable building ROMs for QEMU]) AC_DEFINE([CONFIG_ENABLE_ROMS], [1], [Enable building ROMs for QEMU])
fi fi
# check if we should enable GDB debugging
AC_ARG_ENABLE(gdb_debug, [AS_HELP_STRING([--enable-gdb-debug],[gdb debug supported])], enable_gdb_debug=$enableval, have_roms=no)
if test "$enable_gdb_debug" = "yes"; then
AC_DEFINE([CONFIG_GDB_DEBUG], [1], [Enable debugging with GDB])
fi
# check if we are building FW image or library # check if we are building FW image or library
AC_ARG_ENABLE(library, [AS_HELP_STRING([--enable-library],[build library])], have_library=$enableval, have_library=no) AC_ARG_ENABLE(library, [AS_HELP_STRING([--enable-library],[build library])], have_library=$enableval, have_library=no)
if test "$have_library" = "yes"; then if test "$have_library" = "yes"; then
@ -637,6 +643,8 @@ AC_CONFIG_FILES([
src/platform/intel/cavs/Makefile src/platform/intel/cavs/Makefile
test/Makefile test/Makefile
test/cmocka/Makefile test/cmocka/Makefile
src/include/sof/gdb/Makefile
src/gdb/Makefile
]) ])
AC_REQUIRE_AUX_FILE([tap-driver.sh]) AC_REQUIRE_AUX_FILE([tap-driver.sh])
AC_OUTPUT AC_OUTPUT

View File

@ -8,5 +8,5 @@ SUBDIRS = ipc math audio arch include library host
endif endif
if BUILD_XTENSA if BUILD_XTENSA
SUBDIRS = include init math audio platform tasks drivers ipc lib arch SUBDIRS = include gdb init math audio platform tasks drivers ipc lib arch
endif endif

View File

@ -99,6 +99,7 @@ sof_LDADD = \
../../audio/libaudio.a \ ../../audio/libaudio.a \
../../drivers/libdrivers.la \ ../../drivers/libdrivers.la \
../../math/libsof_math.a \ ../../math/libsof_math.a \
../../gdb/libgdb.a \
-lgcc -lgcc
if BUILD_XTENSA_SMP if BUILD_XTENSA_SMP

View File

@ -126,6 +126,7 @@ libxtos_a_SOURCES = \
core-save.S \ core-save.S \
core-shutoff.S \ core-shutoff.S \
double-vector.S \ double-vector.S \
debug-vector.S \
xea1/exc-alloca-handler.S \ xea1/exc-alloca-handler.S \
xea1/exc-c-wrapper-handler.S \ xea1/exc-c-wrapper-handler.S \
xea2/exc-c-wrapper-handler.S \ xea2/exc-c-wrapper-handler.S \

View File

@ -1,5 +1,5 @@
// debug-vector.S -- Debug Exception Vector // debug-vector.S -- Debug Exception Vector
// $Id: //depot/rel/Foxhill/dot.8/Xtensa/OS/xtos/debug-vector.S#1 $ // $Id: //depot/rel/Eaglenest/Xtensa/OS/xtos/debug-vector.S#2 $
// Copyright (c) 2003-2013 Tensilica Inc. // Copyright (c) 2003-2013 Tensilica Inc.
// //
@ -24,7 +24,11 @@
#include <xtensa/xtensa-versions.h> #include <xtensa/xtensa-versions.h>
#include <xtensa/coreasm.h> #include <xtensa/coreasm.h>
#include <xtensa/config/specreg.h>
#ifdef SIMULATOR
#include <xtensa/simcall.h> #include <xtensa/simcall.h>
#endif
#include <sof/gdb/xtensa-defs.h>
#if XCHAL_HAVE_DEBUG && XCHAL_HAVE_EXCEPTIONS #if XCHAL_HAVE_DEBUG && XCHAL_HAVE_EXCEPTIONS
@ -36,29 +40,33 @@
.global _DebugExceptionVector .global _DebugExceptionVector
_DebugExceptionVector: _DebugExceptionVector:
# if defined(SIMULATOR) || XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RE_2013_2 /* SIMCALL is NOP in hw? */ isync_erratum453
#if ((defined(SIMULATOR) || \
(XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RE_2013_2)) \
&& !defined(CONFIG_GDB_DEBUG)) /* SIMCALL is NOP in hw? */
// In the simulator (ISS), let the debugger (if any is attached) // In the simulator (ISS), let the debugger (if any is attached)
// handle the debug exception, else simply stop the simulation: // handle the debug exception, else simply stop the simulation:
// //
writesr excsave XCHAL_DEBUGLEVEL a2 // save a2 where simulator expects it simcall // have ISS handle the debug exception
movi a2, SYS_gdb_enter_sktloop
simcall // have ISS handle the debug exception
# endif # endif
# ifndef SIMULATOR # if (!defined(SIMULATOR) && !defined(CONFIG_GDB_DEBUG))
// For hardware, this code does not handle debug exceptions. // For hardware, this code does not handle debug exceptions.
// To implement a target-side debug monitor, replace this // To implement a target-side debug monitor, replace this
// vector with a real one that uses target-specific facilities // vector with a real one that uses target-specific facilities
// to communicate with the debugger. // to communicate with the debugger.
// //
1: 1:
# if XCHAL_HAVE_INTERRUPTS // unexpected debug exception, loop in low-power mode
//waiti XCHAL_DEBUGLEVEL // unexpected debug exception, loop in low-power mode //waiti XCHAL_DEBUGLEVEL
# endif
j 1b // infinite loop - unexpected debug exception j 1b // infinite loop - unexpected debug exception
# endif /*!SIMULATOR*/ # endif /*!SIMULATOR && !CONFIG_GDB_DEBUG*/
#if defined(CONFIG_GDB_DEBUG)
xsr a2, DEBUG_EXCSAVE
jx a2
#endif
.end literal_prefix .end literal_prefix
.size _DebugExceptionVector, . - _DebugExceptionVector .size _DebugExceptionVector, . - _DebugExceptionVector
#endif /* XCHAL_HAVE_DEBUG && XCHAL_HAVE_EXCEPTIONS */ #endif /* XCHAL_HAVE_DEBUG && XCHAL_HAVE_EXCEPTIONS */

View File

@ -120,6 +120,7 @@ libxtos_a_SOURCES = \
core-save.S \ core-save.S \
core-shutoff.S \ core-shutoff.S \
double-vector.S \ double-vector.S \
debug-vector.S \
exc-alloca-handler.S \ exc-alloca-handler.S \
exc-c-wrapper-handler.S \ exc-c-wrapper-handler.S \
exc-return.S \ exc-return.S \

View File

@ -25,7 +25,10 @@
#include <xtensa/xtensa-versions.h> #include <xtensa/xtensa-versions.h>
#include <xtensa/coreasm.h> #include <xtensa/coreasm.h>
#include <xtensa/config/specreg.h> #include <xtensa/config/specreg.h>
#ifdef SIMULATOR
#include <xtensa/simcall.h> #include <xtensa/simcall.h>
#endif
#include <sof/gdb/xtensa-defs.h>
#if XCHAL_HAVE_DEBUG && XCHAL_HAVE_EXCEPTIONS #if XCHAL_HAVE_DEBUG && XCHAL_HAVE_EXCEPTIONS
@ -38,29 +41,32 @@
_DebugExceptionVector: _DebugExceptionVector:
isync_erratum453 isync_erratum453
# if defined(SIMULATOR) || XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RE_2013_2 /* SIMCALL is NOP in hw? */ #if ((defined(SIMULATOR) || \
(XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RE_2013_2)) \
&& !defined(CONFIG_GDB_DEBUG)) /* SIMCALL is NOP in hw? */
// In the simulator (ISS), let the debugger (if any is attached) // In the simulator (ISS), let the debugger (if any is attached)
// handle the debug exception, else simply stop the simulation: // handle the debug exception, else simply stop the simulation:
// //
wsr a2, EXCSAVE+XCHAL_DEBUGLEVEL // save a2 where simulator expects it simcall // have ISS handle the debug exception
movi a2, SYS_gdb_enter_sktloop
simcall // have ISS handle the debug exception
# endif # endif
# ifndef SIMULATOR # if (!defined(SIMULATOR) && !defined(CONFIG_GDB_DEBUG))
// For hardware, this code does not handle debug exceptions. // For hardware, this code does not handle debug exceptions.
// To implement a target-side debug monitor, replace this // To implement a target-side debug monitor, replace this
// vector with a real one that uses target-specific facilities // vector with a real one that uses target-specific facilities
// to communicate with the debugger. // to communicate with the debugger.
// //
1: 1:
# if XCHAL_HAVE_INTERRUPTS // unexpected debug exception, loop in low-power mode
//waiti XCHAL_DEBUGLEVEL // unexpected debug exception, loop in low-power mode //waiti XCHAL_DEBUGLEVEL
# endif
j 1b // infinite loop - unexpected debug exception j 1b // infinite loop - unexpected debug exception
# endif /*!SIMULATOR*/ # endif /*!SIMULATOR && !CONFIG_GDB_DEBUG*/
#if defined(CONFIG_GDB_DEBUG)
xsr a2, DEBUG_EXCSAVE
jx a2
#endif
.end literal_prefix .end literal_prefix
.size _DebugExceptionVector, . - _DebugExceptionVector .size _DebugExceptionVector, . - _DebugExceptionVector
#endif /* XCHAL_HAVE_DEBUG && XCHAL_HAVE_EXCEPTIONS */ #endif /* XCHAL_HAVE_DEBUG && XCHAL_HAVE_EXCEPTIONS */

19
src/gdb/Makefile.am Normal file
View File

@ -0,0 +1,19 @@
noinst_LIBRARIES = libgdb.a
libgdb_a_SOURCES = \
init.S
libgdb_a_CFLAGS = \
$(AM_CFLAGS) \
$(ARCH_CFLAGS) \
$(ARCH_INCDIR) \
$(PLATFORM_INCDIR) \
$(SOF_INCDIR)
libgdb_a_CCASFLAGS = \
$(ARCH_INCDIR) \
$(ASFLAGS) \
$(ARCH_ASFLAGS) \
$(PLATFORM_INCDIR) \
$(ARCH_INCDIR) \
$(SOF_INCDIR)

54
src/gdb/init.S Normal file
View File

@ -0,0 +1,54 @@
/*
* Copyright (c) 2018, Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the Intel Corporation nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* Author: Marcin Rajwa <marcin.rajwa@linux.intel.com>
*
* Init debug exeption and enable global breakpoints.
*
*/
#include <sof/gdb/xtensa-defs.h>
.text
.global initDebugException
.align 4
initDebugException:
entry a1, 16
movi a3, DebugExceptionEntry
wsr a3, DEBUG_EXCSAVE
//enable breakpoints
movi a3, 1
wsr a3, IBREAKENABLE
isync
rsync
retw
.size initDebugException, . - initDebugException

View File

@ -0,0 +1,2 @@
noinst_HEADERS = \
xtensa-defs.h

View File

@ -0,0 +1,16 @@
#ifndef XTENSA_DEFS_H
#define XTENSA_DEFS_H
#include <xtensa/specreg.h>
#include <xtensa/config/core-isa.h>
#include <xtensa/corebits.h>
#include <config.h>
#define _AREG0 256
#define STACK_SIZE 1024
#define DEBUG_PC (EPC + XCHAL_DEBUGLEVEL)
#define DEBUG_EXCSAVE (EXCSAVE + XCHAL_DEBUGLEVEL)
#define DEBUG_PS (EPS + XCHAL_DEBUGLEVEL)
#endif /* XTENSA_DEFS_H */

View File

@ -245,7 +245,7 @@ static void platform_memory_windows_init(void)
/* window2, for debug */ /* window2, for debug */
io_reg_write(DMWLO(2), HP_SRAM_WIN2_SIZE | 0x7); io_reg_write(DMWLO(2), HP_SRAM_WIN2_SIZE | 0x7);
io_reg_write(DMWBA(2), HP_SRAM_WIN2_BASE io_reg_write(DMWBA(2), HP_SRAM_WIN2_BASE
| DMWBA_READONLY | DMWBA_ENABLE); | DMWBA_ENABLE);
bzero((void *)HP_SRAM_WIN2_BASE, HP_SRAM_WIN2_SIZE); bzero((void *)HP_SRAM_WIN2_BASE, HP_SRAM_WIN2_SIZE);
dcache_writeback_region((void *)HP_SRAM_WIN2_BASE, HP_SRAM_WIN2_SIZE); dcache_writeback_region((void *)HP_SRAM_WIN2_BASE, HP_SRAM_WIN2_SIZE);