diff --git a/sys/arm/arm/gdb_machdep.c b/sys/arm/arm/gdb_machdep.c new file mode 100644 index 000000000000..a6fa7675e306 --- /dev/null +++ b/sys/arm/arm/gdb_machdep.c @@ -0,0 +1,103 @@ +/*- + * Copyright (c) 2006 Olivier Houchard + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHORS 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. + */ + +#include +__FBSDID("$FreeBSD$"); + + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +static register_t stacktest; + +void * +gdb_cpu_getreg(int regnum, size_t *regsz) +{ + + *regsz = gdb_cpu_regsz(regnum); + + if (kdb_thread == curthread) { + if (regnum < 16) + return (&kdb_frame->tf_r0 + 4 * regnum); + if (regnum == 25) + return (&kdb_frame->tf_spsr); + } + switch (regnum) { + case 8: return (&kdb_thrctx->un_32.pcb32_r8); + case 9: return (&kdb_thrctx->un_32.pcb32_r9); + case 10: return (&kdb_thrctx->un_32.pcb32_r10); + case 11: return (&kdb_thrctx->un_32.pcb32_r11); + case 12: return (&kdb_thrctx->un_32.pcb32_r12); + case 13: stacktest = kdb_thrctx->un_32.pcb32_sp + 5 * 4; + return (&stacktest); + case 15: + /* + * On context switch, the PC is not put in the PCB, but + * we can retrieve it from the stack. + */ + if (kdb_thrctx->un_32.pcb32_sp > KERNBASE) { + kdb_thrctx->un_32.pcb32_pc = *(register_t *) + (kdb_thrctx->un_32.pcb32_sp + 4 * 4); + return (&kdb_thrctx->un_32.pcb32_pc); + } + } + return (NULL); +} + +void +gdb_cpu_setreg(int regnum, void *val) +{ + + switch (regnum) { + case GDB_REG_PC: + if (kdb_thread == curthread) + kdb_frame->tf_pc = *(register_t *)val; + } +} + +int +gdb_cpu_signal(int type, int code) +{ + + switch (type) { + case T_BREAKPOINT: return (SIGTRAP); + } + return (SIGEMT); +} diff --git a/sys/arm/include/gdb_machdep.h b/sys/arm/include/gdb_machdep.h new file mode 100644 index 000000000000..0b38f60d7745 --- /dev/null +++ b/sys/arm/include/gdb_machdep.h @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2006 Olivier Houchard + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + * + * $FreeBSD$ + */ + +#ifndef _MACHINE_GDB_MACHDEP_H_ +#define _MACHINE_GDB_MACHDEP_H_ + +#define GDB_BUFSZ 400 +#define GDB_NREGS 26 +#define GDB_REG_PC 15 + +static __inline size_t +gdb_cpu_regsz(int regnum __unused) +{ + return (sizeof(int)); +} + +static __inline int +gdb_cpu_query(void) +{ + return (0); +} + +void *gdb_cpu_getreg(int, size_t *); +void gdb_cpu_setreg(int, void *); +int gdb_cpu_signal(int, int); + +#endif /* !_MACHINE_GDB_MACHDEP_H_ */ diff --git a/sys/conf/files.arm b/sys/conf/files.arm index a5c4076bfd4e..082e0288fafe 100644 --- a/sys/conf/files.arm +++ b/sys/conf/files.arm @@ -22,6 +22,7 @@ arm/arm/exception.S standard arm/arm/fiq.c standard arm/arm/fiq_subr.S standard arm/arm/fusu.S standard +arm/arm/gdb_machdep.c optional gdb arm/arm/identcpu.c standard arm/arm/in_cksum.c optional inet arm/arm/in_cksum_arm.S optional inet @@ -50,6 +51,13 @@ geom/geom_bsd.c standard geom/geom_bsd_enc.c standard geom/geom_mbr.c standard geom/geom_mbr_enc.c standard +hal.o optional ath_hal \ + compile-with "ATH_HAL_CPU=`echo ${CONF_CFLAGS}|sed 's/.*-mcpu=\([a-zA-Z0-9]*\).*/\1/'`; ATH_ENDIAN=`if (echo ${CC}|grep mbig-endian>/dev/null); then echo be; else echo le; fi;`; uudecode < $S/contrib/dev/ath/public/$$ATH_HAL_CPU-$$ATH_ENDIAN-elf.hal.o.uu" \ + no-implicit-rule +opt_ah.h optional ath_hal \ + compile-with "ATH_HAL_CPU=`echo ${CONF_CFLAGS}|sed 's/.*-mcpu=\([a-zA-Z0-9]*\).*/\1/'`; ATH_ENDIAN=`if (echo ${CC}|grep mbig-endian>/dev/null); then echo be; else echo le; fi;`; cp $S/contrib/dev/ath/public/$$ATH_HAL_CPU-$$ATH_ENDIAN-elf.opt_ah.h opt_ah.h" \ + no-obj no-implicit-rule before-depend \ + clean "opt_ah.h" libkern/arm/divsi3.S standard libkern/arm/ffs.S standard libkern/arm/muldi3.c standard