Module Name: src Committed By: cliff Date: Mon Nov 9 10:00:02 UTC 2009
Modified Files: src/sys/arch/mips/mips [matt-nb5-mips64]: db_interface.c Log Message: arch/mips/mips/db_interface.c - add MIPS64_SHOW32() and MIPS64_SHOW64() macros to show MIPS64 specific cp0 regs - add EIRR, EIMR, EBASE, CONFIG[0,1,7] to show regs >>> these switched by runtime vairable is_rmi_xls is there a better variable to use ??? cpu_arch == 64 ?? - add mach mtcr, mfcr MD ddb commande >>> these are not runtime switched based on cpu arch, they are just 'there' if you use them on the wrong CPU, it's your problem! To generate a diff of this commit: cvs rdiff -u -r1.64.16.6 -r1.64.16.7 src/sys/arch/mips/mips/db_interface.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mips/mips/db_interface.c diff -u src/sys/arch/mips/mips/db_interface.c:1.64.16.6 src/sys/arch/mips/mips/db_interface.c:1.64.16.7 --- src/sys/arch/mips/mips/db_interface.c:1.64.16.6 Tue Sep 15 05:12:53 2009 +++ src/sys/arch/mips/mips/db_interface.c Mon Nov 9 10:00:02 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: db_interface.c,v 1.64.16.6 2009/09/15 05:12:53 matt Exp $ */ +/* $NetBSD: db_interface.c,v 1.64.16.7 2009/11/09 10:00:02 cliff Exp $ */ /* * Mach Operating System @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.64.16.6 2009/09/15 05:12:53 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.64.16.7 2009/11/09 10:00:02 cliff Exp $"); #include "opt_cputype.h" /* which mips CPUs do we support? */ #include "opt_ddb.h" @@ -58,6 +58,7 @@ #include <ddb/db_sym.h> #include <ddb/db_extern.h> #include <ddb/db_interface.h> +#include <ddb/db_lex.h> #endif int db_active = 0; @@ -67,6 +68,8 @@ void db_tlbdump_cmd(db_expr_t, bool, db_expr_t, const char *); void db_kvtophys_cmd(db_expr_t, bool, db_expr_t, const char *); void db_cp0dump_cmd(db_expr_t, bool, db_expr_t, const char *); +void db_mfcr_cmd(db_expr_t, bool, db_expr_t, const char *); +void db_mtcr_cmd(db_expr_t, bool, db_expr_t, const char *); static void kdbpoke_4(vaddr_t addr, int newval); static void kdbpoke_2(vaddr_t addr, short newval); @@ -434,10 +437,60 @@ "", __val); \ } while (0) +#define MIPS64_SHOW32(num, sel, name) \ +do { \ + uint32_t __val; \ + \ + __asm volatile( \ + ".set mips64 \n\t" \ + "mfc0 %0,$" ___STRING(num) "," ___STRING(sel) "\n\t" \ + : "=r"(__val)); \ + printf(" %s:%*s %#x\n", name, FLDWIDTH - (int) strlen(name), \ + "", __val); \ +} while (0) + +/* XXX not 64-bit ABI safe! */ +#define MIPS64_SHOW64(num, sel, name) \ +do { \ + uint64_t __val; \ + \ + __asm volatile( \ + ".set push \n\t" \ + ".set mips64 \n\t" \ + ".set noat \n\t" \ + "dmfc0 $1,$" ___STRING(num) "," ___STRING(sel) "\n\t" \ + "dsll %L0,$1,32 \n\t" \ + "dsrl %L0,%L0,32 \n\t" \ + "dsrl %M0,$1,32 \n\t" \ + ".set pop" \ + : "=r"(__val)); \ + printf(" %s:%*s %#"PRIx64"x\n", name, FLDWIDTH - (int) strlen(name), \ + "", __val); \ +} while (0) + void db_cp0dump_cmd(db_expr_t addr, bool have_addr, db_expr_t count, const char *modif) { + int is_rmi_xls=0; + + /* XXX FIXME what class define to use here ? */ + switch (MIPS_PRID_IMPL(cpu_id)) { + case MIPS_XLS104: + case MIPS_XLS108: + case MIPS_XLS204: + case MIPS_XLS208: + case MIPS_XLS404LITE: + case MIPS_XLS408LITE: + case MIPS_XLS404: + case MIPS_XLS408: + case MIPS_XLS416: + case MIPS_XLS608: + case MIPS_XLS616: + is_rmi_xls = 1; + break; + } + SHOW32(MIPS_COP_0_TLB_INDEX, "index"); SHOW32(MIPS_COP_0_TLB_RANDOM, "random"); @@ -475,6 +528,12 @@ SHOW32(MIPS_COP_0_COUNT, "count"); } + /* XXX FIXME what class define to use here ? */ + if (is_rmi_xls) { + MIPS64_SHOW64(9, 6, "eirr"); + MIPS64_SHOW64(9, 7, "eimr"); + } + if (CPUIS64BITS) { SHOW64(MIPS_COP_0_TLB_HI, "entryhi"); } else { @@ -495,16 +554,24 @@ } SHOW32(MIPS_COP_0_PRID, "prid"); - SHOW32(MIPS_COP_0_CONFIG, "config"); + /* XXX FIXME what class define to use here ? */ + if (is_rmi_xls) { + MIPS64_SHOW32(15, 1, "ebase"); + MIPS64_SHOW32(16, 0, "config0"); + MIPS64_SHOW32(16, 1, "config1"); + MIPS64_SHOW32(16, 7, "config7"); + } else { + SHOW32(MIPS_COP_0_CONFIG, "config"); #if defined(MIPS32) || defined(MIPS64) - if (CPUISMIPSNN) { - uint32_t val; + if (CPUISMIPSNN) { + uint32_t val; - val = mipsNN_cp0_config1_read(); - printf(" config1: %#x\n", val); - } + val = mipsNN_cp0_config1_read(); + printf(" config1: %#x\n", val); + } #endif + } if (MIPS_HAS_LLSC) { if (MIPS_HAS_LLADDR) { @@ -531,10 +598,12 @@ } } -#if !defined(MIPS64_XLS) /* CP0 ECC and CACHE_ERR "not implemented" */ - SHOW32(MIPS_COP_0_ECC, "ecc"); - SHOW32(MIPS_COP_0_CACHE_ERR, "cacherr"); -#endif + /* CP0 ECC and CACHE_ERR "not implemented" on XLS */ + if (!is_rmi_xls) { + SHOW32(MIPS_COP_0_ECC, "ecc"); + SHOW32(MIPS_COP_0_CACHE_ERR, "cacherr"); + } + SHOW32(MIPS_COP_0_TAG_LO, "cachelo"); SHOW32(MIPS_COP_0_TAG_HI, "cachehi"); @@ -546,6 +615,37 @@ } } +void +db_mfcr_cmd(db_expr_t addr, bool have_addr, db_expr_t count, + const char *modif) +{ + extern uint64_t rmixls_mfcr(u_int); + + if (!have_addr) + return; + db_printf("control reg 0x%lx = 0x%" PRIx64 "\n", addr, + rmixls_mfcr(addr)); +} + +void +db_mtcr_cmd(db_expr_t addr, bool have_addr, db_expr_t count, + const char *modif) +{ + db_expr_t value; + extern void rmixls_mtcr(uint64_t, u_int); + + if (!have_addr) + return; + if (db_expression(&value) == 0) { + db_printf("Address missing\n"); + db_flush_lex(); + return; + } + db_skip_to_eol(); + rmixls_mtcr(value, addr); + db_printf("control reg 0x%lx = 0x%" PRIx64 "\n", addr, value); +} + const struct db_command db_machine_command_table[] = { { DDB_ADD_CMD("cp0", db_cp0dump_cmd, 0, "Dump CP0 registers.", @@ -557,6 +657,12 @@ { DDB_ADD_CMD("tlb", db_tlbdump_cmd, 0, "Print out TLB entries. (only works with options DEBUG)", NULL, NULL) }, + { DDB_ADD_CMD("mfcr", db_mfcr_cmd, CS_NOREPEAT, + "Dump processor control register", + NULL, NULL) }, + { DDB_ADD_CMD("mtcr", db_mtcr_cmd, CS_NOREPEAT|CS_MORE, + "Dump processor control register", + NULL, NULL) }, { DDB_ADD_CMD(NULL, NULL, 0, NULL,NULL,NULL) } }; #endif /* !KGDB */